Excel vba 函數 Rnd() 可以預測?

2011-10-14 9:13 pm
我寫了以下程式,抽奬1-100號,結果放在A欄。(假設中奬後可以再中):

Sub test()
X = Int(Rnd() * 100) + 1
Y = Application.WorksheetFunction.Count([A:A]) + 1
Cells(Y, 1) = X
End Sub

原則上Rnd()是隨機數,但把檔案SAVE後,每次再開檔案都會重複相同的抽獎結果

71
54
58
29
31
....

這是一個不公平的隨機抽奬,有冇方法做到一個公平,不可預測的抽奬程式。
更新1:

Thanks 馬王肺話 Randomize [number] 若加入了 [number] ,又有如何含意?

更新2:

簡化程式,用 Randomize 和用 Randomize [100]有何分別? Sub test() Randomize Cells(Application.WorksheetFunction.Count([A:A]) + 1, 1) = Int(Rnd() * 100) + 1 End Sub Sub test() Randomize [100] Cells(Application.WorksheetFunction.Count([A:A]) + 1, 1) = Int(Rnd() * 100) + 1 End Sub

回答 (2)

2011-10-14 10:05 pm
✔ 最佳答案

在使用 Rnd 之前,最好先呼叫 Randomize 陳述式,但不要給任何引數,如此便會以作業系統的時間當作亂數種子來起始亂數產生器。語法Randomize [number]

2011-10-18 17:00:35 補充:
因RANDOMIZE只是產生一個亂數序列, 不加(引數)時會用係統時間值, 所以肯定每次不同. 因很少會用一個固定數去測試結果, 所以不肯定每次用100的答案, 但請於程式中取消中括號. 即 :

Randomize 100

你亦可考慮 以下Rnd(number)的另一功能

如果 number 的值是 --> Rnd 傳回的亂數值
小於 0 --> 每次都是使用 number 當做亂數種子的相同結果。
大於 0 --> 亂數序列中的下一個亂數值。
等於 0 --> 最近一次產生過的亂數值。
省略 --> 亂數序列中的下一個亂數值。

(今次有要小括號)
參考: Excel Help
2011-10-15 4:48 am
Randomize 52
即係好似洗一副啤牌一樣, 製造 52 個亂數。

Randomize
就單純用 system timer 製造亂數。


收錄日期: 2021-04-24 10:47:22
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20111014000051KK00240

檢視 Wayback Machine 備份