首先,当前代码将始终导致数字零是第一个“随机”生成的数字。其次,该公式将产生一个可预测的随机数序列。
这背后的问题是计算机并不聪明,不能真正创建随机数,这就是为什么你需要用 Randomize “播种”它们来“摇动”骰子并得出一个不同的数字。但是,如果你用相同的数字随机化,它将产生完全相同的“随机”数字序列。
例如,如果您使用您的代码,它将始终生成以下数字序列:0、8、7、5 ...
这就是为什么你需要用......随机数“播种”随机数!哈哈。但是你怎么得到一个随机数呢?从技术上讲,你不能,但你可以作弊。您可以执行Randomize (Timer)
or Randomize
,它将 Timer 作为参数,它的作用是“播种”随机数生成,其中包含自午夜以来经过的秒数和毫秒数。因此,如果您每天单击按钮以完全相同的秒和毫秒猜测随机数,那么您将获得相同的随机数序列的唯一时间。
您可以尝试通过添加日、月或年来扩展该理论——这将成倍地扩展“种子”,并且您将永远不会看到重复的随机数序列,但是这样做非常困难,因为一旦您开始玩弄大种子数您会遇到奇怪的问题,例如如果您将一个非常大的数字更改为 1,它仍然会生成相同的随机数序列(在我的测试场景中,使用 5969992 到 5969995 范围内的任何数字进行随机化将导致相同的随机数序列:9、8、6、6、1)。这可能是 Randomize 函数本身的限制。就我个人而言,我不认为它值得尝试超越定时器播种。
以下是调整后的代码以生成更“随机”的数字序列:
Dim Num, Random As Integer
Label2.Caption = ""
Num = Val(Text1.Text)
Randomize
Label1.Caption = Int(10 * Rnd + 1)
Random = Val(Label1.Caption)
If Num = Random Then
Label2.Caption = "you won "
Else
Label2.Caption = "The number " & Num & " Does not equal " & Random
End If