码迷,mamicode.com
首页 > 编程语言 > 详细

[转]C++/C中产生随机数(rand,srand用法)

时间:2018-08-21 21:13:01      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:含义   cimage   输出   dom   时钟   递推公式   img   调用   文件   

参考原文地址:https://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html
  计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生的每个小序列都有一个初始值,即随机种子(即根据某一个初始值代入某个公式产生一系列值),注意:小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后,它们又会重复出现。
  我们知道rand()函数可以用来产生随机数,但这不是真正意义上的随机数,而是一个伪随机数,是根据一个数(我们称之为种子)为基准以某个递推公式算出来的一系列数,当这系列数很大时,就符合正态分布,从而相当于产生了随机数,但这不是真正意义上的数,当计算机正常开机后,这个种子的值是定了的,所以随机数也是定了的,除非你破坏了系统。

  1. rand()
    功能:随机数产生器;  用法:int rand(void);  头文件:stdlib.h
    rand()的内部实现是用线性同余法,它不是真的随机数,因其周期特别长,故在一定范围内可以看成是随机的。
    rand()返回一随机数值的范围在0~RAND_MAX之间。RAND_MAX的范围最少是在32676之间(int),unsigned int则为65535。0~RAND_MAX中每个数字·被选中的几率是相同的。
    当用户未设定随机数种子时,系统默认的随机数种子为1。因此rand()产生的是伪随机数字,每次执行是相同的“?此处有问题,不理解(每次执行的含义是什么)?”,通过运行程序验证发现,每一次执行程序会产生一系列随机数,但每一次运行产生的这一系列随机数是相同的;若要不同,应该用srand()来初始化。
  2. srand()
    功能:初始化随机数发生器 用法:void srand(unsigned int seed) 头文件:stdlib.h
    srand()用来设置rand()产生随机数时的随机数种子。参数seed必须是一个整数。如果每次seed都设为相同值,rand()所产生的随机数值每次就会一样。若想使每次运行的的参数seed不一样,我们可以使用当前时钟作为种子,因为每次运行时间肯定不一样。
  • 2.1. 使用当前时钟作为随机数种子
    使用当前时钟,我们可以使用头文件ctime或time.h里面的time()函数
  1. 产生随机数的方法
  • a. 给srand()提供一个种子,它是一个unsigned int类型;
  • b. 调用rand(),它会根据提供给srand()的种子值返回一个随机数;
  • c. 根据需要多次调用rand(),从而不间断地得到新的随机数
  • d. 无论什么时候,都可以给srand()提供一个新的种子,从而进一步“随机化”rand()的输出结果
  1. 测试代码
#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
 //   srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
 //       for(int i=0;i<10;i++)
 //       cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:没有用srand()初始化每次运行都是下面那一系列数
技术分享图片
srand()初始化

#include<iostream>
#include<cstdlib>
#include<ctime>
//#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
    srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
 //       for(int i=0;i<10;i++)
 //       cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:每次运行产生的一系列数都不同
技术分享图片
技术分享图片

  1. 产生一定范围内的随机数
  • a. [a,b): (rand()%(b-a))+a //取随机数对(b-a)取余(最大为b-a-1),再加上a,,即[a,b)
  • b. [a,b]: (rand()%(b-a+1))+a;
  • c. (a,b]: (rand()%(b-a))+a+1;
  • d. (a,b): (rand()%(b-a-1))+a+1;
  • d. 通用公式: a+rand()%n ,其中a是起始值,n是范围,注意对n取余最大值为n-1
  • e. 要取得0~1之间的浮点数,可以使用rand()/(double)RAND_MAX
#include<iostream>
#include<cstdlib>
#include<ctime>
#define random(a,b) (rand()%(b-a+1)+a)
using namespace std;
int main()
{
    srand((int)time(NULL));
    for(int i=0;i<10;i++)
        cout<<rand()<<‘ ‘;
        cout<<endl;
    for(int i=0;i<10;i++)
        cout<<random(1,100)<<‘ ‘;
    return 0;
}

结果:
技术分享图片

以上

[转]C++/C中产生随机数(rand,srand用法)

标签:含义   cimage   输出   dom   时钟   递推公式   img   调用   文件   

原文地址:https://www.cnblogs.com/qiulinzhang/p/9513673.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!