C语言中srand如果在一个函数中调用能否对另一个函数中的rand产生影响?
一直在搞的一个项目中,自己在改一个R语言的包。包的底层用的是C语言,我想要在运行过程中用到真随机数,所以必须用srand
我今天想要探索的就是,如果我专门声明一个函数set_Srand()
,他的唯一作用就是srand((int)time(0));
,那么我后面所有其他函数中的rand是否都会产生真随机数呢?
以下是4个测试,如果不想看可以直接拉到最底下看结论。
(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
测试1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,j;
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
return 0;
}
输出:
~/myDocuments/Coding/c $ gcc randtest.c -o randtest
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %
测试2
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
srand((int)time(0));
}
void printRand(){
int i,j;
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
int main()
{
//set_Srand();
printRand();
return 0;
}
输出:
~/myDocuments/Coding/c $ gcc randtest.c -o randtest
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10 %(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
测试3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
srand((int)time(0));
}
void printRand(){
int i,j;
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}//(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
int main()
{
set_Srand();
printRand();
return 0;
}
输出:
~/myDocuments/Coding/c $ gcc randtest.c -o randtest
~/myDocuments/Coding/c $ ./randtest
5 9 10 10 8 6 1 5 1 2 %
~/myDocuments/Coding/c $ ./randtest
5 10 8 4 4 8 2 2 8 2 %
~/myDocuments/Coding/c $ ./randtest
5 3 3 3 4 3 3 6 2 10 %
~/myDocuments/Coding/c $ ./randtest
5 6 8 3 5 7 4 9 5 9 %
测试4
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void set_Srand(){
srand((int)time(0));
}
void printRand(){
int i,j;
for(i=0;i<10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
int main()
{
printRand();//(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
printf("\n");
set_Srand();
printRand();
return 0;
}
输出:
~/myDocuments/Coding/c $ gcc randtest.c -o randtest
~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 6 1 2 9 6 9 7 6 2 % ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 9 6 1 10 10 10 1 10 1 % ~/myDocuments/Coding/c $ ./randtest
1 2 8 5 6 3 1 7 7 10
5 2 1 10 1 5 1 4 4 10 %
结论
答案是可以的,我们可以专门声明一个函数,唯一作用就是srand((int)time(0));
,使后面所有其他函数中的rand都产生真随机数
但是注意定语是“后面”,也就是必须把设置srand的子函数的调用地点放在其他用到rand的子函数的调用的前面,不然在srand之前的所有rand返回的值都不是真随机数而是一致的了!
(Copyright © http://blog.csdn.net/s_gy_zetrov. All Rights Reserved)
visitor tracker