所以我有以下代码,
max=2000
min=1
Randomize
cntr = 0
StartTime = Timer
Position = 1
set objFile = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\...\listfile4.csv",2,true)
do while cntr <> 1
cntr = 0
Answer = 1
Lottery = 2
do while Answer <> Lottery
Answer = (Int((max-min+1)*Rnd+min))
Lottery = (Int((max-min+1)*Rnd+min))
cntr = cntr + 1
loop
objFile.WriteLine(cstr(Position & "," & cntr & "," & Answer & "," & Lottery & "," & vbtab))
Position = Position + 1
loop
msgbox (Timer - StartTime)/60基本上我选择了两个pseudoRandom数字
Answer = (Int((max-min+1)*Rnd+min))
Lottery = (Int((max-min+1)*Rnd+min))并尝试查看它们在第一次尝试时匹配的频率。
因此,cntr是两个数字匹配所需的尝试次数的计数。我循环该循环,直到它在第一次尝试时匹配。
当max <2000时,它最终会在第一次尝试时匹配,导致程序结束。
然而,当max >= 2000时,它似乎永远不会结束。对于2000年,它将产生的最低cntr是2。
奇怪的是,我最初设置了max = 10000。如果有足够大的测试集(可以小到1000),则最小cntr始终为51,最大cntr始终为57966
为什么会出现这种模式,比如为什么51是最小的?如何在某些情况下将最小cntr设置为1?我希望程序做一些事情,如果他们在第一次尝试匹配。但是,如果我的最大值大于1999,那么它们在第一次尝试时就永远不会匹配。这是一个问题。
发布于 2014-10-16 08:04:09
首先,你并不是真的在寻找一行中的两个随机数相等,而是2的两个随机数。你的内部循环必须找到连续两次重复的数字。
VBscript使用公式计算数字-没有真正随机的东西。这就是为什么你需要使用随机化,以便你选择一个新的随机数字序列。http://support.microsoft.com/kb/231847为您提供完整的详细信息
如果这些数字真的是随机的(比如抛硬币、掷骰子、抽牌-忽略人为的刻意操纵),那么在你的脚本中,两个数字完全相同的几率应该是2000:1。找到重复的对也只是2000:1,因为生成的数字将是随机独立的。但是使用公式,您创建的是一个数字序列,您得到的下一个数字取决于前一个数字。由于从浮点数乘以整数(降低精度)而导致的舍入,这些数字看起来是随机的,并且随机化在最终是一个非常长但单一的数字列表中创建了一个不同的起点。
如果您想进一步了解,对脚本进行一些调整可能会有所帮助:
r1=rnd r2=rnd,然后在您的答案和彩票计算中使用r1和r2。输出这些数字,您将看到舍入效果如何https://stackoverflow.com/questions/26241948
复制相似问题