我对这里有很多关于在函数调用之间创建相同的随机数集的答案感到困惑。
有些人说如果种下随机函数,你会获得非重复数字,其他正好相反。有人可以告诉我这是如何在VB.Net中完成的吗?
目标:
•我想要种子:a
•我在main中调用rand函数:rand(a)
•给rand的n个函数调用,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}这与我第一次调用这个函数完全不同!
但是我使用相同的种子?
有人能告诉我我做错了吗?
谢谢
答案 0 :(得分:2)
此代码将为您提供相同的随机数序列
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的缺失声明)是需要Randomize
调用的Rnd()
函数(VB6原点)和框架类Random
之间的混合使用Next
方法生成序列中的下一个数字
使用相干的Random类及其Next方法可以解决问题。
如果您仍然希望使用Randomize/Rnd
函数,那么您应该遵循其他答案中链接中给出的建议。但是,保持存在,Rnd
函数返回值<0> 1的单个。当您将此单个赋值为整数时(感谢Option Strict being Off),则为整数只能有0或1的值。Not so much random.
(相同的链接提供了在最大值和最小值之间计算值的方法)
答案 1 :(得分:0)
审核http://msdn.microsoft.com/en-GB/library/8zedbtdt(v=vs.90).aspx
“要重复随机数序列,请在使用带有数字参数的Randomize之前立即使用负参数调用Rnd。使用具有相同Number值的Randomize不会重复上一个序列。”< / p>