嗨,Scripting Guy!

嗨,Scripting Guy!

歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。

今天的問題:如何使用指令碼產生亂數?


如何使用指令碼產生亂數?

嗨,Scripting Guy!我們的稽核人員建議我們隨機抽樣專案,以檢查並確保每個專案都按照公司政策結案及簽發。既然這些專案都依序編號,我想我們應該可以撰寫指令碼來隨機選取要稽核的專案號碼。可以請您幫這個忙嗎?

-- PD

PD,您好。如果您期望的是組織嚴謹、規律、可靠的團隊。我們必須說:「很抱歉,我們幫不上忙。」不過既然您期望的是不按牌理出牌,那就找對人了。

我們發現,VBScript 有一個內建函式 (名稱很好記:Rnd),是專為傳回亂數而設計。先來看一下產生 5 個亂數的指令碼,這些數字都介於 1 到 100 之間。之後我們再解說指令碼的作用:

intHighNumber = 100
intLowNumber = 1
For i = 1 to 5
    Randomize
    intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)
    Wscript.Echo intNumber
Next

如您所見,一開始我們會將值指定給兩個不同的變數:intHighNumber (範圍中的最大數) 和 intLowNumber (範圍中的最小數)。假使我們要產生介於 37 到 956 之間的亂數呢?沒問題:只要調整 intHighNumber 和 intLowNumber 的值即可:

intHighNumber = 956
intLowNumber = 37

接著我們建立一個循環 5 次的 For Next 迴圈。在這個迴圈中,我們找到下列三行程式碼:

Randomize
intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)
Wscript.Echo intNumber

第一行非常重要,完全是由 Randomize 陳述式所構成。此函式使用系統時間來提供 Rnd 函式的「初始」值。由於系統時間會一直變動,表示 Rnd 函式比較有可能產生真正的亂數。事實上,先試試執行這個沒有使用 Randomize 陳述式的指令碼:

intHighNumber = 100
intLowNumber = 1
intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)
Wscript.Echo intNumber

無論執行幾次,得到的「亂」數都相同 (在我們的測試電腦上,每次都是 71)。

下一行程式碼會實際產生亂數:

intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber)

Rnd 函式包含用來產生亂數的演算法;我們只需要將自己的兩個變數 (intHighNumber 和 intLowNumber) 插入方程式即可。另外,我們還使用 Int 函式以確保傳回的是整數而非小數。這一小行程式碼看起來有點奇怪,但是不用擔心;只要把變數插入正確的地方就對了。

差不多就是這樣;我們回應傳回的數字,然後循環並產生下一個亂數。一切都完成時,會得到如下的數字清單:

82
15
92
32
13

對了,是不是可以用這個方法產生號碼來玩樂透呢?可以呀,但這樣比較容易猜中得獎號碼嗎?這麼說好了:Scripting Guys 還是得每天來上班。您自己判斷,要是我們寫的指令碼讓我們玩樂透贏得 1 億美金,還用得著上班嗎。


如需詳細資訊

查看嗨,Scripting Guy!- 過往文件

 

回到頁首 回到頁首