在计算机编程中,常常要产生一个随机数。但是要让计算机产生一个随机数并不那么容易。计算机的执行,是以代码来进行的,所以并不可能像抽牌,扔骰子那样产生一个真正具有随机意义的数。只可能以一定的算法产生一个伪随机数,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()的更多相关文章

  1. 产生随机数(rand()函数和srand()函数)

    有时候,我们需要随机产生一个在某范围的数,C/C++提供了一个库函数rand()来产生随机数. 函数原型:int rand(void); 功能:返回一个[0,RAND_MAX]间的随机整数.其中RAN ...

  2. 【C++】随机数,rand()与srand()函数

    rand()函数 rand()会返回一随机数值, 范围在0至RAND_MAX 间.RAND_MAX定义在stdlib.h, 其值为2147483647. 测试代码: #include<cstdl ...

  3. C/C++中产生随机数(rand,srand用法)

    计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535 ...

  4. C++ 随机数rand()和srand()

    标准函数库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h中定义的一个整数,它与系统有关. 例如在我的机器上,RAND_MAX=32767.可以 ...

  5. srand()、rand()、time()函数的用法

    srand()就是给rand()提供种子seed. 如果srand每次输入的数值是一样的,那么每次运行产生的随机数也是一样的. 以一个固定的数值作为种子是一个缺点.通常的做法是 :以这样一句srand ...

  6. 转:随机函数 C++中rand()函数的用法

    转自:http://blog.163.com/wujiaxing009@126/blog/static/719883992011113011359154/ 一.C++中不能使用random()函数   ...

  7. C++中rand()函数的用法

    C++中rand()函数的用法   2011-12-30 11:03:59|  分类: C / C++|举报|字号 订阅 一.C++中不能使用random()函数 random函数不是ANSI C标准 ...

  8. PHP随机函数rand()、mt_rand()、srand()、mt_srand() 的区别

    1.生成随机数发生器种子的函数 srand(). mt_srand() 区别:mt_srand()  比 srand() 更好的生成随机数发生器种子 定义: void srand([int $seed ...

  9. 神奇的随机数rand()

    随机数在统计理论中占有很重要的地位,很多应用都需要用到他,系统自带的rand()函数产生的是伪随机数,所以该如何真正的随机数呢? 1.c语言中的时间函数 关于c语言我查到的两个比较好的博文是:http ...

随机推荐

  1. oracle dblink使用

    一.dblink介绍 dblink是一个单向的数据库连接,通过设置可以访问其他数据库中的数据跟使用本地数据库中数据一样的感觉,但注意是单向的dblink.例如:A建连B的dblink,A可以访问B的表 ...

  2. Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynamics CRM 2011 2013 解决办法

    Error message “Assembly must be registered in isolation” when registering Plugins in Microsoft Dynam ...

  3. vmware 8下ubuntu 13.04安装vmware tools

    在虚拟机vmware 8.0里安装了ubuntu 13.04.为了方便与主机交互,安装vmware tools. 解压后直接运行 ./vmware-install.pl 一路默认路径安装下来,到&qu ...

  4. PC-XP系统忘记密码怎么办

    (一)以恢复本地用户"*****"口令为例,来说明解决忘记登录密码的步骤:1.重新启动计算机,在启动画面出现后马上按下F8键,选择"带命令行的安全模式".2.运 ...

  5. 来自奢侈品行业的CEO能给苹果带来什么?

    重回苹果的奢侈品大佬:保罗丹诺威 作为伊夫·圣罗兰(Saint Laurent)时尚集团的前CEO,保罗丹诺威(Paul Deneve)9月将正式加入苹果公司,并负责该公司所谓的“特殊项目”,同时直接 ...

  6. oracle中使用sql查询时字段为空则赋值默认

    转至:http://www.th7.cn/db/Oracle/201501/86125.shtml oracle 通过 nvl( )函数sql 查询时为 空值 赋默认值 oracle 函数介绍之nvl ...

  7. UML类图中类与类的四种关系图解

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. js修改input的type属性问题

    js修改input的type属性有些限制.当input元素还未插入文档流之前,是可以修改它的值的,在ie和ff下都没问题.但如果input已经存在于页面,其type属性在ie下就成了只读属性了,不可以 ...

  9. WPF WebBrowser

      XAML <Window x:Class="WpfApplication5.Window1"     xmlns="http://schemas.microso ...

  10. mysql strace fsync,fdatasync

    mysql> show create table y; +-------+------------------------------------------------------------ ...