作者jlovet ( Q我~)
看板Programming
標題Re: [問題] 亂數問題
時間Wed Mar 12 23:42:31 2008
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
→ jlovet:另外是可以讀取外部裝置傳來的資料...140.123.102.254 03/12 23:43
推 noguest:除了時間, 原文還有不能用亂數函式來做種 64.9.238.248 03/13 09:20
→ noguest:子喔. 還有pid(和thread id)很夠用了, 即 64.9.238.248 03/13 09:21
→ noguest:便是用預設的32768, 兩次要相同的機率已經 64.9.238.248 03/13 09:22
→ noguest:小於0.005%. 若這樣還不滿意, 很簡單, 把 64.9.238.248 03/13 09:22
→ noguest: max pid 改大就好, 例如, 在linux 下是 64.9.238.248 03/13 09:23
→ noguest:/proc/sys/kernel/pid_max, 在 unix 下是 64.9.238.248 03/13 09:24
→ noguest:/etc/system, 在 32-bit 下, 最大可改成 64.9.238.248 03/13 09:24
→ noguest:2^22, 也就是 4194304 64.9.238.248 03/13 09:25
→ noguest:另外, 可以用數學式子來做亂數產生器, 只 64.9.238.248 03/13 09:33
→ noguest:要seed不同,產生出的亂數不會變成constant 64.9.238.248 03/13 09:34