当我设置这段代码时,每次调试软件时,它都会生成相同的数字。谁能告诉我为什么会这样?
dim value as integer
value = (CInt(Int(100 * Rnd())))
messagebox.show(value)
Run Code Online (Sandbox Code Playgroud)
因为它应该是随机的。这是一个例子:(从上到下)
这种情况一遍又一遍地发生,前两次我认为这只是运气,但是当我这样做了几次时,它总是回到 70(例如)。
但是当我保持软件运行并一遍又一遍地运行代码时,通过使用一个按钮,它会生成完全不同的随机数。再次启动它,再次出现数字70。
你需要打电话
Randomize()
Run Code Online (Sandbox Code Playgroud)
在调用 Rnd() 初始化随机数生成器之前。如果不这样做,每次运行该程序时,您都会得到相同的数字序列。
例子:
dim value as integer
Randomize()
value = (CInt(Int(100 * Rnd())))
messagebox.show(value)
Run Code Online (Sandbox Code Playgroud)
原因是 Rnd() 将始终使用相同的种子来启动序列。如果你想阅读更多关于它的信息,这里有很好的解释:https : //msdn.microsoft.com/en-us/library/8zedbtdt(v=vs.90).aspx
每次获得相同随机数的原因是,当程序运行时,它总是以相同的种子数开始生成第一个随机数。要更改种子,您可以添加此..
Randomize()
Run Code Online (Sandbox Code Playgroud)
进入代码的 _load 事件。这会根据时间更改种子。
或者,您可以使用以下代码,因为这样不需要每次运行程序时都调用“Randomize”,并且更容易控制生成的数字范围。例如,您可以选择生成 45 到 967 或您喜欢的任何其他范围的数字,而不是按照下面的代码生成 0 到 100 范围内的随机数,只需更改第二行的参数即可。
Dim randomGenerator As New Random 'add this to the beginning for your Form1 class
value =randomgenerator.Next(0,100) 'add this into your methods as needed
Messagebox.Show(value)
Run Code Online (Sandbox Code Playgroud)
将 randomGenerator 声明为项目范围变量可能比在代码块中不断重新声明它更好 - 这是因为它使用时间作为种子。
如果声明处于在较小时间间隔内迭代的紧密循环中,则每次声明变量时种子有时可能是相同的,并且最终可能会多次生成相同的数字。例如 - 这是不这样做的方法:-
For i As Integer = 1 To 1000
Dim a As New Random
Console.WriteLine(a.Next())
Next
Run Code Online (Sandbox Code Playgroud)