【问题标题】:How to create same set of random numbers every time a function is executed in VB.NET每次在 VB.NET 中执行函数时如何创建相同的随机数集
【发布时间】:2023-03-31 11:56:02
【问题描述】:

这里有很多关于在函数调用之间创建相同的随机数集的答案,我真的很困惑。

有些人说,如果你给随机函数播种,你会得到不重复的数字,而恰恰相反。有人可以告诉我这是如何在 VB.Net 中完成的吗?

目标:

• 我想要种子:a

• 我在 main 中调用 rand 函数:rand(a)

• 给定 n 次对 rand 的函数调用,rand(a) 给出 随机数A,

• 运行结束

• 我再次运行 main,我希望得到相同的随机数集 一个

以下是一些想法:

Private Function Generate_Random_Number(Byval Lower as integer, Byval Upper as integer, Byval seed as integer) 
    Dim Random_Value as Integer

    randomize(seed)
    random_value = rand.next(lower, upper + 1)

    Return random value
End Function

Private Sub Main()
    Seed = 100

    For i = 0 to 1 'run this function for two times
        Get_Random_Numbers(Seed)
    Next i
End Sub

Private Sub Get_Random_Numbers(Seed)
    Dim x, y, w, z as integer

    x = Generate_Random_Number(0,1, seed)
    y = Generate_Random_Number(1,2, seed)
    w = Generate_Random_Number(2,3, seed)
    z = Generate_Random_Number(3,4, seed)
End Sub 

假设对 Get_Random_Numbers 的第一个函数调用给我 {x = 0, y = 1, w = 2, z = 3},无论出于何种原因,对 Get_random 数字的下一次调用给我 {x = 1, y = 2, w = 3, z= 4} 这和我第一次调用这个函数时完全不同!

但我使用的是同一个种子?

谁能告诉我我做错了什么?

谢谢

【问题讨论】:

  • 你必须使用相同的种子,然后你会得到相同的伪随机数(例如总是 1000)。 stackoverflow.com/questions/22712456/…
  • @Tim 他使用相同的种子,但 rand.Next 是莫名其妙的。兰特在哪里声明?
  • @Steve:他可能想知道为什么每次调用该方法时都会得到不同的数字。但是,如果他再次用相同的种子而不是相同的实例初始化Random,他只会得到相同的数字。 编辑忘记这条评论,他使用Randomize。我以前没用过。
  • 要获得您正在寻找的行为,请改用 System.Random。
  • @Steve:我认为他需要在Randomize(seed) 之后使用Rnd()。但如前所述,我对旧的 VB 函数并不熟悉。我猜 OP 有一个混合体,rand 是一个 Ramdom 变量,它在整个应用程序中被重用。

标签: vb.net random


【解决方案1】:

此代码将为您提供相同的随机数序列

Public rand as Random

Private Sub Main()

    Dim Seed = 100
    For i = 0 to 1 
        rand = new Random(seed)
        Get_Random_Numbers()
    Next i
End Sub


Private Sub Get_Random_Numbers()
    Dim x, y, w, z as integer
    x = Generate_Random_Number(0,10)
    y = Generate_Random_Number(10,20)
    w = Generate_Random_Number(20,30)
    z = Generate_Random_Number(30,40)
    Console.WriteLine(x & ", " & y & ", " & w & ", " & z)
End Sub 

Private Function Generate_Random_Number(Byval Lower as integer, Byval Upper as integer) 
    Dim Random_Value as Integer
    Random_Value = rand.Next(lower, upper + 1)
    Return Random_Value
End Function

主要区别在于在全局级别声明Random 类型的变量,并在每个循环开始时使用相同的种子对其进行初始化。代码中的主要问题(忘记变量 rand 的缺失声明)是需要 Rnd() 调用的 Randomize 函数(来自 VB6)和使用 Next 的框架类 Random 之间的混合产生序列中下一个数字的方法。
连贯地使用 Random 类及其 Next 方法可以解决问题。

如果您仍然喜欢使用 Randomize/Rnd 函数,那么您应该遵循其他答案链接中给出的建议。但是,请注意,Rnd 函数会返回一个 single,其值介于 0 和 1 之间。当您将此单个分配给一个整数时(感谢 Option Strict being Off),那么 Integer 只能有一个值为 0 或 1。Not so much random.
(相同的链接提供了在最大值和最小值之间计算值的方法)

【讨论】:

    【解决方案2】:

    评论http://msdn.microsoft.com/en-GB/library/8zedbtdt(v=vs.90).aspx

    “要重复随机数序列,请在使用带有数字参数的 Randomize 之前立即使用负参数调用 Rnd。使用具有相同 Number 值的 Randomize 不会重复前面的序列。”

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      相关资源
      最近更新 更多