如何於C++產生亂數?
以下是一個例子,輸出一個由0-4的亂數。留意,行號2,3,8,9,10及11是需要的。
備註: 如要輸出0-9的話,把行11的rand()%5改成rand()%10便可以。
----------------------------------------------------------------------------
使用電腦產生亂數其實不是一件容易的事,以下是說明。
於C++內,有一個函數(function)可用以輸出亂數,rand(),預設是由0至一個數目,rand()於cstdlib內,因此要使用rand(),必須先要載入cstdlib的標頭檔(加入#include <cstdlib>)。以下的程式便是使用rand()輸岀5個亂數。
重要訊息: 如果同學重新執行以上程式的話,會發覺輸出的5個亂數是完全一樣的,那是因為rand()其實並不能真正產生亂數,這函數其實是根據一個起始值(稱為亂數種子seed),透過一個算式,計算出所謂「亂數」出來的。由於這個起始值沒有改變,因此每次執行程式時輸出的結果便一樣。
解決方法: 使用srand()這函數可讓rand()每次輸出時使用不同的亂數種子(seed),所以要加入行11。
但要用甚麼數值作為亂數種子,而每次又可以不同的呢? 最常用的是系統時間(因每次肯定不同的),使用time(NULL)便可以取得系統時間。(但要加#include <ctime>,因為有關時間函數位於ctime的標頭檔內。)
把讀取到的時間數值貯存於seed變數內,作為亂數種子便可以。(留意,由於系統時間的數值很長,因此seed變數要用long int,長整數)
同學再執行以上程式時,便可發覺每次輸出皆不同的了。
如何產生指定範圍內的亂數?
由於輸出的亂數是一個長整數,因此要輸出指出範圍的話,使用取餘數(%)運算了便可以。例如以下例子,把長整數除5取餘數的話,便祇有0,1,2,3或4,即是輸出由0-4的數子。
同學可以想想,如想輸出1-5的話,那如何撰寫?
把輸出的亂數值加1便可以啦!
同學會否覺得很麻煩? 輸出一個指定範圍的亂數,竟然要撰寫這麼多行程式? 於Scratch內,不是用一個磚塊指令便解決嗎?
其實很明顯,於Scratch內,設計者把這產生指定範圍亂數的功能,寫了一段程式行,然後以自定函數的方式變成以上磚塊指令,方便使用而已。(畢竟設計遊戲時,許多時都需要產生亂數來進行(例如要角色隨機地出現)。
於C++內,沒有內置這函數,但同學一樣可以使用自定函數的方式制作出來的。
後記:
亂數其實廣泛應用於科學研究及應用中,但使用電腦來產生亂數則不是一件容易的事情,因為電腦祇懂得運算,要進行運算便有指定的算法,相同來源數據下,算法便自然會計算出相同的結果,所以即使是rand()的函數,嚴格來說我們稱它產生的是「偽亂數」,仍是有跡可尋的,但於一般應用上已足夠使用。
同學如對亂數有興趣的話,可再參考相關的文章或書籍。
沒有留言:
張貼留言