Re: [問題] 亂數程式連續執行

看板C_and_CPP作者 (小風)時間14年前 (2010/02/11 21:33), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串5/6 (看更多)
※ 引述《etrexetrex (moonet)》之銘言: : ※ 引述《phterry (小風)》之銘言: : : 在下提供一個方法, 利用 CPU cycle 當種子, 這樣做可以確保每次取得 : : 的亂數都會不一樣, 因為 CPU cycle 是一個 hardware status, 在系統 : : 上所有的 process 都會讓 CPU cycle 的值增加, 因此在 software level : : 無法預測它的值, 也不需要利用 sleep 或跑迥圈拖慢執行速度, 但缺點 : : 是利用 assembly 的關係, 若在不同平台上, 要有不同的 implementation, : : 以下提供 x86 上的做法如下: : : void my_srand(void) : : { : : long long cpu_cycle; : : asm volatile(".byte 15;.byte 49" : "=A" (cpu_cycle)); : : srand((unsigned int)cpu_cycle); : : } : : 只要利用上述這個 function 取代原有的 srand() 就可以了, 大致上 : : 用法如下: : : int main() : : { : : int r_num; : : my_srand(); : : r_num = rand(); : : ....... : : } : 日期/時間函數<time.h> : clock_t clock(void): : 傳回程式開始執行後所使用的CPU時間,以ticks為單位, : 除以常數CLK_TCK就是秒數。 : 參考資料 : http://www.ocu.edu.tw/~hsing/file/C_Plus_Library.doc 感謝你提出的意見, clock() 在不同的 OS 上, 有不同的實作. 請試著 跑看看以下的例子, #include <stdio.h> #include <time.h> int main() { clock_t c0 = -1, c1; int i; for (i = 0; i < 100000; i++) { if (c0 != c1) { c0 = c1; printf("i=%d, clock()=%ld\n", i, c1); } } return 0; } Linux 上執行的結果: i=0, clock()=0 i=11686, clock()=10000 i=30125, clock()=20000 i=50217, clock()=30000 i=70045, clock()=40000 i=88455, clock()=50000 在Linux上所下的結論: 1. clock()的回傳值, 並不會很詳細的記錄每一個 CPU tick, 反而是以秒為單位變化. 註: man page 有以下的說明可解釋此現象: Note that the time can wrap around. On a 32-bit system where CLOCKS_PER_SEC equals 1000000 this function will return the same value approximately every 72 minutes. 2. 此回傳值在每個 process 裡的初始值都是 0, 也因此, 同一支程式在不同的時間 執行時, 如果不特殊處理, 會產生亂數相等的情形, 因為同一支程式呼叫 srand() 的時機一樣. (光是這點, 就不如使用 time() 了) 基於亂數的需求就是不可預測性, 不建議使用 clock() 作為亂數的種子. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.172.160.190
文章代碼(AID): #1BT0T09W (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BT0T09W (C_and_CPP)