博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析C语言中的rand函数和srand函数(一)
阅读量:5875 次
发布时间:2019-06-19

本文共 1470 字,大约阅读时间需要 4 分钟。

我们在编程实现算法的过程中,往往需要使用到随机数。由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?)。所以计算机生成的是伪随机数,供我们使用。

我们使用C语言的rand函数,生成的也是伪随机数。

一个简单的示范如下:

1 #include 
2 #include
3 #include
4 5 int 6 main(int argc, char** argv) 7 { 8 // 以机器当前的时间来构造生成伪随机数的"种子" 。 9 srand((unsigned int)time(NULL));10 int i;11 // 打印10个伪随机数 12 for (i = 0; i < 10; i++) {13 14 printf("%d ", rand());15 }16 printf("\n");17 18 system("pause");19 return 0;20 }

 

很显然,如果不使用第九行的srand函数,那么我们的程序每次打印的10个伪随机数序列是一样的,在本机上始终是41, 18467, 6334, ......。这是由于C语言是利用linear congruential generator作为生成器来生成伪随机数,但是这个生成器生成伪随机数,需要一个“种子”来进行运算。而如果我们仅仅调用rand函数,那么我们始终使用的是C语言自己设置的固定的“种子”来生成伪随机数,所以生成的伪随机数的序列肯定是一模一样的咯。

当我们使用srand,以时间为参数,为rand提供一个不一样的“种子”,那么由于每次的“种子”都不一样,当然每次的伪随机数的序列都不一样。

但是从代码实现中,我们不能清楚地看出来srand函数提供的“种子”如何就被rand函数用上了。

从ISO C99标准(ISO/IEC 9899:1999(E))当中的伪随机数一节(7.20.2 Pseudo-random sequence generation functions),我们可以看到一个简明的可移植的实现样例:

1 static unsigned long int next = 1; 2  3 int rand(void) // RAND_MAX assumed to be 32767 4 { 5     next = next * 1103515245 + 12345; 6     return (unsigned int)(next/65536) % 32768; 7 } 8  9 void srand(unsigned int seed)10 {11     next = seed;12 }

 

在这个样例中,“种子”为静态内部变量next,初始值为1。如果我们不使用srand来更新next,很显然我们每次调用程序生成的伪随机数都是一样的(next从1开始)。如果我们在程序中用srand来更新next,那么我们每次运行程序,就给next初始化以不同的值,于是就能够得到不一样的伪随机数序列。

 

但是,rand函数和srand函数的实现真如样例这般简单吗?

放到下篇再写吧。

转载于:https://www.cnblogs.com/nipan/p/4081913.html

你可能感兴趣的文章
Centos/Ubuntu下安装nodejs
查看>>
关于浏览器的cookie
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
国内先进的智能移动广告聚合平台-KeyMob聚合
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
PHP - 如何打印函数调用树
查看>>
js闭包
查看>>
寒假。3.3.G - Common Child (最大公共子序)
查看>>
设计模式学习笔记--原型模式
查看>>
.Net 通过MySQLDriverCS操作MySQL
查看>>
JS Cookie
查看>>
ubuntu Unable to locate package sysv-rc-conf
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
【吉光片羽】短信验证
查看>>
MacBook如何用Parallels Desktop安装windows7/8
查看>>
gitlab 完整部署实例
查看>>
GNS关于IPS&ASA&PIX&Junos的配置
查看>>
七天学会ASP.NET MVC (四)——用户授权认证问题
查看>>