当我设置这段代码时,每次调试软件时它都会产生相同的数字。谁能告诉我为什么会这样?
dim value as integer
value = (CInt(Int(100 * Rnd())))
messagebox.show(value)
因为它应该是随机的。 这是一个例子:(从上到下)
这种情况一遍又一遍地发生,前两次我认为这只是运气,但是当我做了几次时它总是回到70(作为一个例子)。
但是当我保持软件运行并且我一遍又一遍地运行代码时,通过使用按钮,它会生成完全不同的随机数字。再次启动它,再次有70号。
答案 0 :(得分:2)
您需要致电
Randomize()
在调用Rnd()初始化随机数生成器之前。如果不这样做,每次运行程序时都会得到相同的数字序列。
示例:
dim value as integer
Randomize()
value = (CInt(Int(100 * Rnd())))
messagebox.show(value)
原因是Rnd()将始终使用相同的种子来启动序列。如果您想了解更多相关信息,请在此处解释:https://msdn.microsoft.com/en-us/library/8zedbtdt(v=vs.90).aspx
答案 1 :(得分:2)
每次获得相同随机数的原因是程序运行时,它始终以相同的种子编号开始,以生成第一个随机数。要更改种子,您可以添加此..
Randomize()
进入代码的_load事件。这会根据时间更改种子。
或者,您可以使用以下代码,因为这不需要调用'随机化'每次运行程序时,控制生成的数字范围要容易得多。例如,根据下面的代码,不是0到100范围内的随机数,您可以选择生成45到967之间的数字或任何其他您喜欢的范围,只需更改第二行的参数即可。
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)
将randomGenerator声明为项目范围变量而不是在代码块中重新声明它可能更好 - 这是因为它使用时间作为种子。
如果声明处于紧密循环中并且在很短的时间间隔内迭代,则每次声明变量时种子有时可能是相同的,并且最终可能会生成多次生成相同的数字。例如 - 这是不怎么做: -
For i As Integer = 1 To 1000
Dim a As New Random
Console.WriteLine(a.Next())
Next
答案 2 :(得分:2)
由于这被标记为.Net,因此您不应使用VB6遗留功能。对于.Net,使用Random Class这是一个需要按钮和标签的示例。
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Label1.Text = GenRandInt(100).ToString
End Sub
Private Shared prng As New Random 'only need one - should not be in a method
Private Function GenRandInt(maxValue As Integer) As Integer
'returns an integer between 0 and maxValue inclusive
Return prng.Next(maxValue + 1)
End Function
End Class
阅读文档以了解Random类的详细信息和其他用途。
编辑:如果由于某种原因您决定继续使用Rnd,请在使用之前调用Randomize。