概述
一直想好好的系统的学习一下C语言的伪随机数,今天终于逮到机会了
伪随机数
C语言中有可以产生随机数据的函数,需要添加stdlib.h和time.h头文件。首先在main函数开头加上srand(unsigned)time(NULL))。
先来介绍一下srand
头文件:
定义函数:void srand (unsigned int seed);
函数说明:srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是个整数,通常可以利用getpid()或time(0)的返回值来当做seed。如果每次seed都设相同值,rand()所产生的随机数值每次就会一样。
再来介绍一下time,
函数名称: time
函数原型: time_t time(time_t *timer)
函数功能: 得到机器的日历时间或者设置日历时间
函数返回: 机器日历时间
参数说明: timer=NULL时得到机器日历时间,timer=时间数值时,用于设置日历时间,time_t是一个long类型
所属文件:
因此上述的srand((unsigned)time(NULL))是利用系统时间来初始化随机种子的。
最后来介绍一下重要的一个函数rand
rand函数
头文件:
定义函数:int rand(void)
函数功能:产生随机数
函数说明:因为rand的内部实现是用线性同余法做的,它不是真的随机数,只不过是因为其周期特别长,所以,在一定的范围里可看成是随机的。rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。
返回值: 返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。且0-RAND_MAX每个数字被选中的机率是相同的。
rand()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
举个例子
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",rand());
}
return 0;
}
说白了上述的随机数范围是0~32767之间,若没有设置系统时间种子,则rand默认随机种子为1,则多次运行结果都是一致的。
当然,若想要一个给定范围的随机数,则需要使用rand()%(b-a+1)+a。显然rand()%(b-a+1)的范围是[0,b-a],再加上a即为[a,b]。
举个例子([0,1]和[3,6]之间的随机数)
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",rand()%2);
}
putchar('n') ;
for(int i=0;i<10;i++){
printf("%d ",rand()%4+3);
}
return 0;
}
一般来说这个范围最大是0~32767,若想要生成超过32767的更大的随机数,则可以采用,移位或者拼凑或者用随机数除以RAND_MAX,这样就会得到一个[0,1]范围内的浮点数。只需要这个浮点数乘以范围长度(b-a+1)再加上a即可。即(int)((double)rand()/32767*(b-a+1)+a),相当于这个浮点数在[a,b]范围内的比例位置
举个例子
#include
#include
#include
int main(){
srand((unsigned)time(NULL));
for(int i=0;i<10;i++){
printf("%d ",(int)((1.0*rand()/RAND_MAX*50000+10000)));//10000~60000
}
return 0;
}
PS:介绍一个简单的AC技巧,在程序中一次性计算出所有需要用到的结果,然后查询直接取这些结果,典型的AC技巧有木有(●ˇ∀ˇ●)
小结
C语言的伪随机数适用范围还是挺广泛的,下次需要用起来的时候,就不需要再去找什么资料了。
最后
以上就是认真鸡翅为你收集整理的c语言 伪随机数程序,C语言的伪随机数的全部内容,希望文章能够帮你解决c语言 伪随机数程序,C语言的伪随机数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复