Re: [問題] 亂數程式連續執行
※ 引述《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();
: .......
: }
: ※ 引述《justinC (無)》之銘言:
: : 遇到的問題: (題意請描述清楚)
: : 我的亂數程式在連續執行時, 由於時間間隔很短,
: : srand() 傳入的參數一樣,而造成兩次得到的亂數值相同,
: : 有人知道該如何將他打亂嗎?
: : update: 想到一個解法...加上 process pid
: : 程式跑出來的錯誤結果:
: : i=1
: : i=2
: : i=6
: : i=3
: : i=2
: : ---
: : i=1
: : i=2
: : i=6
: : i=3
: : i=2
: : ---
: : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux)
: : Freebsd
: : 有問題的code: (請善用置底文標色功能)
: : #include <stdio.h>
: : #include <stdlib.h>
: : #include <time.h>
: : void f()
: : {
: : int iSecret;
: : iSecret = rand() % 10 + 1;
: : printf("i=%d\n",iSecret);
: : }
: : int main ()
: : {
: : int iSecret;[A
: : srand (time(NULL) );
: : int k=0;
: : for(k=0;k<5;k++){
: : f();
: : }
: : printf("---\n");
: : return 0;
: : }
: : 補充說明:
日期/時間函數<time.h>
clock_t clock(void):
傳回程式開始執行後所使用的CPU時間,以ticks為單位,
除以常數CLK_TCK就是秒數。
參考資料
http://www.ocu.edu.tw/~hsing/file/C_Plus_Library.doc
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.118.9.202
討論串 (同標題文章)