调用Rnd()生成相同的数字

时间:2016-01-06 23:08:18

标签: vb.net random

当我设置这段代码时,每次调试软件时它都会产生相同的数字。谁能告诉我为什么会这样?

dim value as integer
value = (CInt(Int(100 * Rnd())))
messagebox.show(value)

因为它应该是随机的。 这是一个例子:(从上到下)

  • 我调试软件
  • 代码运行,并生成数字70
  • 我停止调试
  • 我再次调试它再次生成数字

这种情况一遍又一遍地发生,前两次我认为这只是运气,但是当我做了几次时它总是回到70(作为一个例子)。

但是当我保持软件运行并且我一遍又一遍地运行代码时,通过使用按钮,它会生成完全不同的随机数字。再次启动它,再次有70号。

3 个答案:

答案 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。