C/C++随机数rand()和种子函数srand()
在计算机编程中,常常要产生一个随机数。但是要让计算机产生一个随机数并不那么容易。计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数。只可能以一定的算法产生一个伪随机数,C/C++提供了一个函数,放在cstdlib中,叫做rand(),原型为:int rand(void);。
显然,这个函数不接受任何参数,它的作用是:产生一个[0..RAND_MAX]之间的随机数。RAND_MAX也存放在cstdlib中,是一个宏常量:
#define RAND_MAX Ox7FFF
RAND_MAX最大是,默认是
。但是总不可能每改一次范围,都将常量修改。所以一般都这样使用:
rand()%max //这个表达式会生成[0..max-1]之间的随机数
这个函数并不可以凭空产生随机数,而是需要一个随机数种子。这个种子由同样存放在cstdlib中的srand函数提供,原型为:void srand(unsigned seed);。当你使用rand()但是没有提前产生一个种子时,默认情况下初始化种子值为1。如果用户之前调用过srand(seed)的话,rand()会重新调用一遍srand(seed)以产生随机数种子;如果发现没有调用过 srand(seed)的话,则会自动调用 srand(1)一次。而相同的种子只会生成相同的随机数序列。所以,只有srand(seed)后,才能得到你所要的结果——近似随机的伪随机数。看一下下面的程序。
#include <cstdlib>
#include <ctime>
#include <iostream> using namespace std;
const int maxs=; int main() {
for (int i=;i<=;++i){
srand(time(NULL));
cout<<rand()%maxs<<endl;
}
return ;
}
运行之后,你会发现,纵使指定了随机数种子,但是仍没有得到想要的结果——它输出了10个一模一样的随机数!想一想,time(NULL)返回一个1970-1-1 00:00:00到当前时间的秒数。但是由于for运行太快了,所以rand()产生了相同随机数序列中的第一个数,要想避免这个问题,其实也很简单,只要将srand(seed)提到for循环之前,这样就只会产生一次种子。问题也随之解决了。
C/C++随机数rand()和种子函数srand()的更多相关文章
- 产生随机数(rand()函数和srand()函数)
有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数. 函数原型:int rand(void); 功能:返回一个[0,RAND_MAX]间的随机整数.其中RAN ...
- 【C++】随机数,rand()与srand()函数
rand()函数 rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 测试代码: #include<cstdl ...
- C/C++中产生随机数(rand,srand用法)
计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...
- C++ 随机数rand()和srand()
标准函数库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h中定义的一个整数,它与系统有关. 例如在我的机器上,RAND_MAX=32767.可以 ...
- srand()、rand()、time()函数的用法
srand()就是给rand()提供种子seed. 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的. 以一个固定的数值作为种子是一个缺点.通常的做法是 :以这样一句srand ...
- 转:随机函数 C++中rand()函数的用法
转自:http://blog.163.com/wujiaxing009@126/blog/static/719883992011113011359154/ 一.C++中不能使用random()函数 ...
- C++中rand()函数的用法
C++中rand()函数的用法 2011-12-30 11:03:59| 分类: C / C++|举报|字号 订阅 一.C++中不能使用random()函数 random函数不是ANSI C标准 ...
- PHP随机函数rand()、mt_rand()、srand()、mt_srand() 的区别
1.生成随机数发生器种子的函数 srand(). mt_srand() 区别:mt_srand() 比 srand() 更好的生成随机数发生器种子 定义: void srand([int $seed ...
- 神奇的随机数rand()
随机数在统计理论中占有很重要的地位,很多应用都需要用到他,系统自带的rand()函数产生的是伪随机数,所以该如何真正的随机数呢? 1.c语言中的时间函数 关于c语言我查到的两个比较好的博文是:http ...
随机推荐
- Android 天气应用开发
百度 API Store中很多免费的天气API,因此写一个天气应用相对变得很容易. 首先尝试API给的接口,接受返回数据. public class MainActivity extends Acti ...
- 解决 Provider 'System.Data.SqlServerCe.3.5' not installed. -摘自网络
在64位机器上开发,如果使用到SqlServerCe的话,那么很可能会碰到这个问题,问题有两个方面: 1.如提示所云,没有安装SqlServerCe,只要去微软下载就好了. 2.系统已经安装SqlSe ...
- Eclipse的下载、安装和WordCount的初步使用(本地模式和集群模式)
包括: Eclipse的下载 Eclipse的安装 Eclipse的使用 本地模式或集群模式 Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群 ...
- 【荐】Redis学习资料汇总
Redis学习手册(目录) - Stephen_Liu - 博客园 Redis 命令参考 — Redis 命令参考 Redis_php 学习 - 简单--生活 - 博客园
- Sublime Text 教程
编辑器的选择(Editor Choices) 从初学编程到现在,我用过的编辑器有EditPlus.UltraEdit.Notepad++.Vim.TextMate和Sublime Text,如果让我从 ...
- 在COM接口中不要使用同时出现只是大小写不同的名字作为属性名、函数名或者参数名
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:在COM接口中不要使用同时出现只是大小写不同的名字作为属性名.函数名或者参数名.
- Quartz 定时器时间设置
spring定时器的时间设置 时间的配置如下:<value>0 26 16 * * ?</value> 时间大小由小到大排列,从秒开始,顺序为 秒,分,时,天,月,年 ...
- Java正则表达式:Pattern类和Matcher类
一.捕获组的概念 捕获组可以通过从左到右计算其开括号来编号,编号是从1 开始的.例如,在表达式 ((A)(B(C)))中,存在四个这样的组: 1 ((A)(B(C))) 2 (A) 3 ...
- mvc:annotation-driven' must have no character or element问题
使用SpringMVC,启动tomcat报这个错误 解决办法 首先将Spring版本提升到3.1及以上 如果还不行替换xml文件头部: <?xml version="1.0" ...
- Java SE学习之printf 日期转换符
本文是学习网络上的文章时的总结,感谢大家无私的分享. System.out.printf()方法能够对日期做处理输出. 相应列表 转换符 类型 举例 c 完整的日期和时间 Mon Feb 09 18: ...