我是靠谱客的博主 认真鸡翅,最近开发中收集的这篇文章主要介绍c语言 伪随机数程序,C语言的伪随机数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一直想好好的系统的学习一下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;

}

e46faef3910f34fcfc167799b4a1f520.png

说白了上述的随机数范围是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;

}

7686c3f7b128c6ce79e9608e42ca2b25.png

一般来说这个范围最大是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;

}

7952385b8499b1771a1417d409bf2e35.png

PS:介绍一个简单的AC技巧,在程序中一次性计算出所有需要用到的结果,然后查询直接取这些结果,典型的AC技巧有木有(●ˇ∀ˇ●)

小结

C语言的伪随机数适用范围还是挺广泛的,下次需要用起来的时候,就不需要再去找什么资料了。

最后

以上就是认真鸡翅为你收集整理的c语言 伪随机数程序,C语言的伪随机数的全部内容,希望文章能够帮你解决c语言 伪随机数程序,C语言的伪随机数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部