2014-10-07 130 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. 只是有一個單一的循環,所以你要計算直到一個重複的數字,而不是一對重複多久。你應該發現這個來更接近到你期望的統計。