[問題] 關於srand(time(NULL))應用於多process

看板C_and_CPP作者 (情執)時間13年前 (2010/10/18 15:04), 編輯推噓7(7024)
留言31則, 9人參與, 最新討論串1/1
#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<time.h> int main(){ int n1=0,n2=0; pid_t pid; pid=fork(); if(pid==0){ srand(time(NULL)); //child n1=rand()%10; printf("n1:%d\n",n1); exit(-1); }//end if else{ srand(time(NULL)); //parent n2=rand()%10; printf("n2:%d\n",n2); wait(); }//end else }//end main 上述code中,印出來的n1 以及 n2每次都相等 可是我就是希望他有時候不一樣, 回溯原因我想可能是出在srand(time(NULL))吧! 可是既然已經fork了 竟然發現兩個process的time(NULL)每次取的值都一樣 這是因為現在multi-processor的關係嗎? 想要讓兩個process time(NULL)取的值不同該怎麼做呢? 感謝大家~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.68.5 ※ 編輯: sandybright 來自: 140.113.68.5 (10/18 15:07)

10/18 16:14, , 1F
因為time(NULL)只有準確到秒?
10/18 16:14, 1F

10/18 16:18, , 2F
可以在任何一個 srand 前面 sleep 個一兩秒就可以了
10/18 16:18, 2F

10/18 16:21, , 3F
我也有這樣的問題,卡了好幾個月,2樓是一個方法
10/18 16:21, 3F

10/18 16:21, , 4F
可是如果要用到大量運算會等很久
10/18 16:21, 4F

10/18 16:22, , 5F
我也想知道這到底該怎解才好XD
10/18 16:22, 5F

10/18 16:23, , 6F
其中一個改成 srand(time(NULL)); srand(rand()); 這樣
10/18 16:23, 6F

10/18 16:23, , 7F
反正就是別讓 srand() 裡面擺同一個數字就好
10/18 16:23, 7F

10/18 16:23, , 8F
其實也可以簡單的用 srand(time(NULL) + 1); 啦....XDD
10/18 16:23, 8F

10/18 16:51, , 9F
其實我也是大概跟大家處理方式差不多
10/18 16:51, 9F

10/18 16:53, , 10F
child使用srand(time(NULL)) parent使用srand(pid)
10/18 16:53, 10F

10/18 16:53, , 11F
純粹是想說為什麼會不一樣~~
10/18 16:53, 11F

10/18 16:53, , 12F
其實兩個都用 srand(getpid()); 也是可以
10/18 16:53, 12F

10/18 16:53, , 13F
一樣
10/18 16:53, 13F

10/18 16:56, , 14F
因為兩個 process 在同一秒鐘呼叫 time(NULL), 就會一樣
10/18 16:56, 14F

10/18 16:57, , 15F
對 CPU 來說,一秒已經是很漫長的時間了 XD
10/18 16:57, 15F

10/18 16:57, , 16F
所以聽起來似乎是cpu跑太快XD
10/18 16:57, 16F

10/18 16:58, , 17F
剛才查到time(NULL)如同一樓所說,以秒為單位
10/18 16:58, 17F

10/18 16:59, , 18F
謝謝大家
10/18 16:59, 18F

10/18 17:13, , 19F
void mySrand(){ srand(time(0)+rand(); }
10/18 17:13, 19F

10/18 17:13, , 20F
) 少一個...
10/18 17:13, 20F

10/18 17:26, , 21F
這樣兩個process time(NULL)+rand()的值似乎是一樣?
10/18 17:26, 21F

10/18 17:27, , 22F
因為 time(NULL) 相同, rand() 的第一個值還是相同
10/18 17:27, 22F

10/18 17:49, , 23F
why not use pid ?
10/18 17:49, 23F

10/18 17:49, , 24F
or pid + time ? XD
10/18 17:49, 24F

10/18 17:55, , 25F
ㄟ斗...不管誰先用到,rand()都已經改變了
10/18 17:55, 25F

10/18 17:58, , 26F
對不起我想成兩個執行緒...SORRY= =
10/18 17:58, 26F

10/19 01:16, , 27F
那... srand( <-- read from /dev/random ) 如何 XD
10/19 01:16, 27F

10/19 01:23, , 28F
沒看過樓上的用法~可以教一下嗎~
10/19 01:23, 28F

10/19 09:36, , 29F
樓上可以去找「/dev/random」這個東西是什麼
10/19 09:36, 29F

10/20 01:49, , 30F
要不要試試看 RDTSC 呢?
10/20 01:49, 30F

10/23 00:13, , 31F
林奕成表示:
10/23 00:13, 31F
文章代碼(AID): #1Ck_5o9D (C_and_CPP)