Re: [問題] 有關於亂數產生不重覆的問題

看板C_and_CPP (C/C++)作者 (sjgau)時間19年前 (2005/10/03 10:31), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串1/2 (看更多)
談 樂透程式的亂數產生器 產生亂數的副程式是 樂透程式的關鍵, 可是,連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
請大大來M起來..太重要了...
10/04 00:23, 2F

10/04 20:44, , 3F
這是線性同餘法 這不是什麼了不起的秘密吧
10/04 20:44, 3F
文章代碼(AID): #13G9Vptr (C_and_CPP)
文章代碼(AID): #13G9Vptr (C_and_CPP)