C 亂數 預測 難得一問...贈20點吧...

2007-05-22 8:42 am
我想請問...電腦的亂數其實不一定是真的亂數...
那又該如何去預測呢?
又要如何去模擬亂數產生時的狀況?
像是以下...
-----------------------
srandom(33);
for( n = (now / (60*60*3)) - 62820; n >0; n--) random();
B=random() % 8;
------------------------
據說是每五個小時取一次亂數
然後亂數結果是是八種
但是我整個就是看不懂...囧
不知道梗出在哪裡...
煩請大大幫我解釋一下...
那又該如何去設定預測?
先謝了...囧
更新1:

還是霧沙沙... 囧...

更新2:

能不能實際舉個例... 或是哪裡有亂數表?? 這因該是用在BBS... 那BBS又是用什麼編譯器呢?

回答 (6)

2007-05-25 12:54 pm
✔ 最佳答案
假設您的 random() 函數會產生至少 8 種的均勻亂數值,假設範圍在 0~10000 之間的整數,那麼

 B=random()%8;

表示 B 為 0~10000 之間的任意數值除以 8 後所得的餘數。所以囉,任意數字除以 8 取餘數就只會有 8 種,分別是 0、1、2、3、4、5、6 與 7。

假設您的時間戳記 now 的單位為秒,並且是從 1970/01/01 00:00:00'GMT 開始計算(也就是從 1970/1/1 00:00:00 開始到現在已經過了多少秒),那麼在 1991/07/02 15:00:00 開始,for 迴圈就失效了,也就是 for 迴圈中的 random(); 不再執行。

程式語言所提供的亂數,多數會以亂數種子為依據,產生第一個亂數值,而後的亂數值依據上一個亂數值產生。根據您的程式:

 srandom(33);

 /*接下來這行在 1991/07/02 15:00:00 後就不會執行了*/
 /*1991/07/02 15:00:00 時間戳記為 678466800*/
 /*678466800/(60*60*3)=62821,62821-62820=1>0,致使迴圈失效*/
 for(n=(now/(60*60*3))- 62820; n >0; n--) random();

 B=random()%8;

也就是變成以下等效的程式:

 srandom(33);

 B=random()%8;

如果每次 B 的亂數值都是由亂數種子 33 決定,那麼不用說五小時,而是每次取得的亂數值都一樣,並且是落在 0~7 之間(各種語言工具所提供的亂數產生方式不一,所得到的結果與您所使用編譯器的不同而有所不同)。

2007-05-25 05:13:53 補充:
至於如何預測,假設您的 random() 的尺度為 32 bits,也就是 2 的 32 次方種,依據程式語言所提供的亂數方式(下一次的亂數值取決於這一次的亂數值),淡藍色認為從位元排列方式的觀點,統計 2 的 32 次方加 1 次的亂數序列,必定至少會有一次循環序列發生,接著依據循環序列求算 random() 產生亂數的數學規則。

2007-06-01 13:11:26 補充:
unsigned long int next = 1; /*這個用來當作亂數種子*/

/* srandom: set seed for random() */
void srandom(unsigned int seed)
{
 next = seed; /*設定亂數種子*/
}

2007-06-01 13:12:53 補充:
/* random:return pseudo-random integer on 0...32767 */
int random(void)
{
 /* 將亂數種子做很大的數學變化,例如乘上很大的數或者加上很大的數,淡藍色認為這些數字以巨大的質數為最好。 */
 next = next * 1103515245 + 12345;

 /* 這裡用來限定回傳的範圍 */
 return (unsigned int) (next/65536) % 32768;
}

2007-06-01 13:38:51 補充:
仔細觀察 random() 回傳的亂數值根據 next 決定,而 srandom() 函數直接決定 next 為何,也就是只要 next 固定成一個值(您的例子為 33),則 random() 回傳的亂數值就會固定是某一個值。這是假設作法,各家編譯器編譯所編譯的程式,透過固定的亂數種子所產生的那個固定亂數值都有所不同。

2007-06-01 13:39:20 補充:
至於您提到的 BBS 是指電子佈告欄(Bulletin Board System)吧?它是一種網路相關的應用程式,應該不限定什麼工具語言製作,但是淡藍色認為會以 C 語言工具製作為多。
參考: Microsoft MSDN, time() 函數時間戳記起點 1970/01/01 00:00:00(與 Unix 所制定的時間戳記起點相同), 無, 這是一個假設的作法,參考自 http://tw.knowledge.yahoo.com/question/question?qid=1507050403889, 這是一個假設的作法,參考自 http://tw.knowledge.yahoo.com/question/question?qid=1507050403889, 無, 無
2014-09-09 8:48 am
* ***** http://*****

[電子遊戲]
拉霸、水果盤、7PK、5PK

[運彩遊戲]
棒球、籃球、足球、網球、冰球、各種體育經典賽事

[真人遊戲]
百家樂、21點、骰寶、輪盤、牌九、三公、輪盤、翻攤、牛牛、二八杠

[對戰遊戲]
台灣麻將、德州撲克、骰盅吹牛、四支刀、鬥地主、十三支、二八槓、暗棋、接龍

[彩球遊戲]
香港六合、台灣樂透、今彩539、樂合彩、大陸時時彩、基諾彩、北京賽車、賽狗、賽馬、指數

[優惠活動]
1. 新舊會員儲值就送500點
2. 真人百家樂彩金等你拿
***** http://*****
歡迎免費體驗試玩!!

線上影片直播、正妹圖、討論區免費註冊 ~
2007-06-01 5:50 pm
電腦亂數通常會先用種子產生一個表格或者說是數學函數(有很多種實作方式)
以後每次要亂數就照順序從表格抓
每個種子產生的表格都不相同
所以你只要知道種子跟用種子產生表格用的方法
就可以抓到規律
為了讓種子不容易被猜到所以常見的做法是用時間當種子
這樣每次跑的時候種子都不一樣

還有一種就是表格產生的不好而造成每隔固定個變數就會重複循環出現
那麼你不必知道種子
只要觀察出循環的規則也可以預測亂數
2007-05-22 9:21 pm
這篇
http://tw.knowledge.yahoo.com/question/question?qid=1007020513461
和其中另兩位的回答,請參考一下。

另外,這篇與其中的意見,也看一下。
http://tw.knowledge.yahoo.com/question/question?qid=1507050403889

2007-05-22 13:24:20 補充:
再寫點那 2 篇沒寫到的好了
其實,電腦裡常用的亂數除了 C 的那種平均分佈的以外,還有標準分佈。
MatLab 的亂數就有提供這 2 種不同型的亂數。

那 2 篇討論的,主要是不均分佈。

2007-05-22 13:24:49 補充:
打錯字!
平均,不是不均
2007-05-22 6:51 pm
亂數表…

高中的數學課本,後面的附錄有亂數表。
2007-05-22 8:54 am
關於亂數的問題,我回答了好幾次了。
亂數其實是有亂數表的。
去找一些文件都找得到。
你可以去找C++,Java,C#中對Random類別的定義和說明。
當然都是英文文件,希望你不排斥。
基本上他只是保證能回傳你一個符合統計學上平均分佈的結果。
他並不是完全的隨機。
當你程式到某個程度的時候。
很多東西要自己來了。


收錄日期: 2021-04-27 17:13:37
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20070522000010KK00495

檢視 Wayback Machine 備份