Re: [問題] 亂數問題

看板Programming作者 ( Q我~)時間17年前 (2008/03/12 23:42), 編輯推噓1(1010)
留言11則, 2人參與, 最新討論串3/5 (看更多)
pid_max 大部分就是32767 或者到65535? 算是很小的數字吧... #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void * msrand(void * data); struct p{ int * data; int id; }; int main(){ pthread_t pt[5]; struct p pp[5]; int d[5]={7919,22307,48611,104729,287117}; for(int i=0;i<5;i++){ pp[i].data=&d[0]; pp[i].id=i; pthread_create(&pt[i],NULL,msrand,&pp[i]); } for(int i=0;i<5;i++){ pthread_join(pt[i],NULL); } printf("%d %d %d %d %d\n",d[0],d[1],d[2],d[3],d[4]); } void * msrand(void * data){ struct p * pp = (struct p *) data; int * ptr=pp->data; int self=pp->id; for(int i=0;i<100;i++){ srand(ptr[(self+1)%5]); ptr[self]^=rand(); ptr[self]<<13; usleep(10); sched_yield(); } } 跟time沒有關係 你這樣跑一次之後,就可以得到五個int的...數... 亂不亂我不能證明... 這邊我還是用到了srand跟rand 因為...如果想自己寫數學式子弄亂數的話...生到最後都會變成一個constant... 沒有pthread的話要怎麼辦...我就不知道了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.102.254

03/12 23:43, , 1F
另外是可以讀取外部裝置傳來的資料...
03/12 23:43, 1F

03/13 09:20, , 2F
除了時間, 原文還有不能用亂數函式來做種
03/13 09:20, 2F

03/13 09:21, , 3F
子喔. 還有pid(和thread id)很夠用了, 即
03/13 09:21, 3F

03/13 09:22, , 4F
便是用預設的32768, 兩次要相同的機率已經
03/13 09:22, 4F

03/13 09:22, , 5F
小於0.005%. 若這樣還不滿意, 很簡單, 把
03/13 09:22, 5F

03/13 09:23, , 6F
max pid 改大就好, 例如, 在linux 下是
03/13 09:23, 6F

03/13 09:24, , 7F
/proc/sys/kernel/pid_max, 在 unix 下是
03/13 09:24, 7F

03/13 09:24, , 8F
/etc/system, 在 32-bit 下, 最大可改成
03/13 09:24, 8F

03/13 09:25, , 9F
2^22, 也就是 4194304
03/13 09:25, 9F

03/13 09:33, , 10F
另外, 可以用數學式子來做亂數產生器, 只
03/13 09:33, 10F

03/13 09:34, , 11F
要seed不同,產生出的亂數不會變成constant
03/13 09:34, 11F
文章代碼(AID): #17r_dmmu (Programming)
討論串 (同標題文章)
文章代碼(AID): #17r_dmmu (Programming)