2014-10-07 156 views
0

所以我下面的代码,Vbscipt随机数发生器

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 

基本上我选择2个[伪]随机数

 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年,那么他们在第一次尝试时就不会匹配。这是个问题。

+0

你的问题到底是什么? – aphoria 2014-10-07 18:58:51

+0

我必须测试它,但它似乎是'Int'函数中四舍五入过程的一个副作用。用'CLng'替换它们并尝试。 – 2014-10-07 21:14:53

+0

我确实想过要测试这个。 'Clng'只是返回一组不同的标准Min和Max。这让我觉得它与命令(?)'Randomize'有关 – myacobucci 2014-10-07 22:59:50

回答

0

首先,你并不是真的只是在一行中寻找2个随机数,而是2个2.你的内部循环必须找到连续两次重复的数字。

VBscript使用公式计算数字 - 没有真正的随机数。这就是为什么你需要使用随机化,以便你选择一个新的随机序列的数字。 http://support.microsoft.com/kb/231847为您提供了详细的信息

如果数字是真正的随机数(如掷硬币,骰子滚动,卡片绘制 - 忽略故意的人为操纵),您预计2个数字的几率相同为2000:1在你的脚本中。由于产生的数字是随机独立的,所以发现重复对也只是2000:1。但有了公式,你正在创建一系列数字,下一个数字取决于前一个数字。这些数字由于从浮点数乘以整数(精度降低)导致的舍入而出现,并且随机创建一个不同的起点,最终形成一个非常长而单一的数字列表。

如果您想进一步了解,你的脚本一对夫妇的调整可能会有所帮助:

  1. 包括一个TOTALCOUNT,让你了解它究竟有多少循环,直到你可以到达第一个重复对
  2. 将rnd值存储在一个变量中并输出它们,例如r1=rnd r2=rnd然后在您的答案和彩票计算中使用r1和r2。输出这些数字,你会看到四舍五入的效果如何
  3. 尝试运行代码没有随机或随机X(选择一些数字),但具有不同的最大值。您将开始看到rnd调用的总数,以便根据舍入查找重复对的上下变化。但是,随着您增加最大值,趋势将是总数大量增加。你会发现一些例外 - 毕竟它是随机的,但通常你会减少重复对的概率,因为你减小了舍入影响。
  4. 对于固定的最大数字,将Randomize(无数字)放回去。查看您得到的结果,您会发现相同的数字对出现多次。
  5. 只是有一个单一的循环,所以你要计算直到一个重复的数字,而不是一对重复多久。你应该发现这个来更接近到你期望的统计。