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


    参考原文地址: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;
    }
    
    

    结果:每次运行产生的一系列数都不同
    srand()_1
    srand()_2
    5. 产生一定范围内的随机数

    • 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;
    }
    
    

    结果:
    1~ 100

    以上

  • 相关阅读:
    TCP协议实现双工通信
    搭建本地FTP服务器
    CSS 3 选择器root、not、empty、target
    CSS 3 中的伪类选择器
    CSS 3 中的属性选择器
    Entity Framework Code First属性映射约定
    Entity Framework数据库初始化四种策略
    HTML 5 Base 64 编码
    HTML 5 离线程序
    HTML5 本地数据库IndexedDB数据库
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/9513673.html
Copyright © 2020-2023  润新知