作者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
1F:→ jlovet:另外是可以读取外部装置传来的资料...140.123.102.254 03/12 23:43
2F:推 noguest:除了时间, 原文还有不能用乱数函式来做种 64.9.238.248 03/13 09:20
3F:→ noguest:子喔. 还有pid(和thread id)很够用了, 即 64.9.238.248 03/13 09:21
4F:→ noguest:便是用预设的32768, 两次要相同的机率已经 64.9.238.248 03/13 09:22
5F:→ noguest:小於0.005%. 若这样还不满意, 很简单, 把 64.9.238.248 03/13 09:22
6F:→ noguest: max pid 改大就好, 例如, 在linux 下是 64.9.238.248 03/13 09:23
7F:→ noguest:/proc/sys/kernel/pid_max, 在 unix 下是 64.9.238.248 03/13 09:24
8F:→ noguest:/etc/system, 在 32-bit 下, 最大可改成 64.9.238.248 03/13 09:24
9F:→ noguest:2^22, 也就是 4194304 64.9.238.248 03/13 09:25
10F:→ noguest:另外, 可以用数学式子来做乱数产生器, 只 64.9.238.248 03/13 09:33
11F:→ noguest:要seed不同,产生出的乱数不会变成constant 64.9.238.248 03/13 09:34