今天用到了C语言伪随机数进行测试,用完了顺便总结一下。
最基本,直接使用int rand(void)函数 它会为我们返回一个整形的数
#include <stdlib.h>
…………
int r = rand();
…………
然而当我们把上面程序改为:
…………
for(int i = 0;i<100;i++)
printf("%d--%d/n",i,rand());
…………
我们会发现运行结果总为:
当然不同的机器可能有差别,但是你发现多次运行的结果都是一样的。这样的随机数某些时候是不够我们使用的。究其原因,我们不难在MSDN中找到答案。在生成随机数之前需要设置随机种子。系统提供了 void srand( unsigned int seed )来完成该设置。默认情况下seed = 1;该函数设置随机数的起始位置。进而我们将代码改动为:
…………
srand(2);//默认为1 故设置为2区别
for(int i = 0;i<100;i++)
printf("%d--%d/n",i,rand());
…………
这次的运行结果为 :
当然 ,我们会发现运行结果总上面的。
经过多次改动我发现,srand()每设置一个值对等的就有一组固定的随机数。反过来一想若是每次srand()每次设置的是一个未知的随机的数,那产生的随机数组也自然也就是一个比较切合实际的随机。所以将成代码改为:
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++)
printf("%d--%d/n",i,rand());
…………
这样产生的随机数,多次运行也不会出现前面那样的相同序列了。
但是不管之前的哪个代码,最好不要将设置随机数的起始位置放到了for循环中,那样你会得到一个很糟糕的随机数或者根本就不是随机数了。
以下介绍几种产生需要范围的随机数。
1.产生范围low到high之间的随机数 :(以下low<high)
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++){
if (r>low&&r<high)
printf("%d--%d /n",i,rand());
else
i++;
}
…………
2.若low = 0 又可以 将代码改为:
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++){
printf("%d--%d /n",i,rand()%(high+1));//包括high
}
…………
3.若low = 0 &&high = 1,即0-1的小数,又可以 将代码改为:
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++){
printf("%d--%f /n",i,rand()/((double)RAND_MAX));//包括high,返回为double类型也可用float存储
}
…………
4.有了上面代码,又可以产生0-high之间的浮点数
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++){
printf("%d--%f /n",i,high*((rand()/((double)RAND_MAX))));//包括high,返回为double类型也可用float存储
}
…………
5.最后再简单介绍一个产生负数的:
产生low-0之间的浮点数
…………
srand( (unsigned)time( NULL ) );//系统时间
for(int i = 0;i<100;i++){
printf("%d--%f /n",i,low*((rand()/((double)RAND_MAX))));//包括high,返回为double类型也可用float存储
}
…………
其余情况只需将上面的代码进行适当的变形即可得到想要的随机数。
参考文献:http://baike.baidu.com/view/1127.htm
初识微学忘各位指点。