所以我有以下代码,
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
基本上我选择了两个[伪]随机数
Answer = (Int((max-min+1)*Rnd+min))
Lottery = (Int((max-min+1)*Rnd+min))
试着看看他们在第一次尝试时的匹配频率。
所以cntr是这两个数字匹配所需的尝试次数。 我循环遍历该循环,直到它在第一次尝试时匹配。
当max
&lt; 2000它最终会在第一次尝试时匹配,导致程序结束。
然而,当max
&gt; = 2000时,它似乎永远不会结束。 2000年,cntr
产生的最低值为2
。
这是奇怪的部分,我最初设置max = 10000
。如果有足够多的测试集(最低可达1000),则最小cntr
始终为51
,最大cntr
始终为57966
为什么这种模式存在,因为51为什么最小?在某些情况下,如何将最小cntr
设为1?我希望程序在第一次尝试时匹配。但是,如果我的最大数量大于1999年,他们在第一次尝试时就不会匹配。这是个问题。
答案 0 :(得分:0)
首先,你并不是真的在寻找连续2个随机数相等但2个2的内容。你的内循环必须找到连续两次重复的数字。
VBscript使用公式计算数字 - 真的是随机的。这就是为什么你需要使用randomize,这样你就可以选择一个新的随机序列数字。 http://support.microsoft.com/kb/231847为您提供完整的详细信息
如果数字真的是随机的(比如掷硬币,骰子掷骰,抽牌 - 忽略故意的人为操控),你会发现你的剧本中2个数字相同的几率为2000:1。找到一个重复的对也将只是2000:1,因为生成的数字将是随机独立的。但是使用公式,您将创建一系列数字,下一个数字取决于之前的数字。由于从浮点数乘以整数(降低精度)导致的舍入,数字看起来是随机的,并且随机化在最终非常长但单一的数字列表中创建不同的起点。
如果您想进一步了解,可以对脚本进行一些调整:
r1=rnd r2=rnd
然后在答案和抽奖计算中使用r1和r2。输出这些数字,你会看到圆角效应