Re: [問題] 有關於亂數產生不重覆的問題
談 樂透程式的亂數產生器
產生亂數的副程式是 樂透程式的關鍵,
可是,連XX銀行,每個月的營業規模達
數十億台幣的樂透程式,他們的亂數也是
寫得很爛。
不相信的話,請你花 一百元買兩組電腦選號
的樂透,然後看看你拿到的號碼,是否滿意?
問題是出在,他們對於產生亂數的副程式
了解不夠,寫的不夠好。
目前,全世界最經常被使用的產生亂數的副程式,
其數學公式如下
r(n)= (r(n-1)*a + b) mod c
第 n 個亂數,等於 前一個亂數,
乘以 a, 加上 b
把得到的結果,對 c 取餘數
(a, b, c) 的選擇,非常重要
IBM 建議使用
a= 16807, b= 0, c= 2147483647
另外一組被推薦的是
a= 48271, b= 0, c= 2147483647
※ 引述《DarkKiller (System hacked)》之銘言:
: 呃...
: ※ 引述《sjgau (sjgau)》之銘言:
: : 一 亂數產生器產生出來的亂數
: : 必須是 均勻分配,
: : 如果需要其他的統計分配,
: : 使用進一步的數學方法得之
: 沒有人規定 Pseudo Random Number Generator 一定要是 Uniform Distribution,
: 實際上也的確有 Non-uniform PRNG。
: : 二 儘可能的 擁有最長的週期,
: 這在大多數的情況下是對的。
: : 在週期的循環之前,每一個可能的出現,
: : 必須確實出現
: : 譬如說,產生 1 - ((2^31) - 2)的亂數,
: : 以 67891 為種子數,
: : 在產生 下一個 6791 之前,必須 以上的每個數子
: : 都出現過 一次
: 但這是錯的,cycle 要講的東西不是這樣。
: : 四 通常是 由時間函數取得亂數的種子數,
: : 但是,必須經過一些額外的處理,
: : 以免在短戰的時間內,重複取得的時間函數值相同
: : 或是,過於接近
: 下面 <五> 的內容要移上來。
: : 五 產生的亂數,必須是 看起來不可預期
: : 不可以在每次開機的時候,有相同的亂數產生。
: : 不可以 每次產生都得到預期的結果。
: <五> 的標題跟內容無關。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 210.243.237.65
推
10/03 11:35, , 1F
10/03 11:35, 1F
推
10/04 00:23, , 2F
10/04 00:23, 2F
推
10/04 20:44, , 3F
10/04 20:44, 3F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章