Vbscript随机生成器

时间:2014-10-07 17:41:59

标签: random vbscript

所以我有以下代码,

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

1 个答案:

答案 0 :(得分:0)

首先,你并不是真的在寻找连续2个随机数相等但2个2的内容。你的内循环必须找到连续两次重复的数字。

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

如果数字真的是随机的(比如掷硬币,骰子掷骰,抽牌 - 忽略故意的人为操控),你会发现你的剧本中2个数字相同的几率为2000:1。找到一个重复的对也将只是2000:1,因为生成的数字将是随机独立的。但是使用公式,您将创建一系列数字,下一个数字取决于之前的数字。由于从浮点数乘以整数(降低精度)导致的舍入,数字看起来是随机的,并且随机化在最终非常长但单一的数字列表中创建不同的起点。

如果您想进一步了解,可以对脚本进行一些调整:

  1. 包含一个总计数,这样您就可以了解到达第一个重复对之前需要多少循环
  2. 将rnd值存储在变量中并输出它们,例如r1=rnd r2=rnd然后在答案和抽奖计算中使用r1和r2。输出这些数字,你会看到圆角效应
  3. 尝试运行不使用Randomize的代码或使用Randomize X(您选择的某个数字),但使用不同的最大值。您将开始看到rnd调用的总数,以查找重复对基于舍入的上下变化。但是,当您增加最大值时,趋势将是总数大幅增加。你会发现一些例外 - 毕竟它是伪随机的,但通常你会减少重复对的概率,因为你减少了舍入影响。
  4. 使用固定的最大数字,重新输入Randomize(无数字)。查看结果,您会发现多次出现相同的数字对。
  5. 只需要一个循环,这样就可以计算出一个重复的数字,而不是一对重复。您应该会发现更接近符合您的统计预期。