zoukankan      html  css  js  c++  java
  • [转]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

    以上

  • 相关阅读:
    [转]写给刚工作的技术人员
    IT人士如何有效地学习
    一个学习Unity的网址,记下来以后用.
    .NET Remoting学习总结之一:Remoting的使用场景
    犯了不该犯的错:UNION和UNION ALL没搞清楚,今天写下它们的区别,要谨记在心!
    实用代码:单个读取Console中输入的键
    无意中试用了一下PostSharp,感觉很不错,看得出它对那些重复性的编程会有不少帮助.
    博客的搬迁历程
    .NET 6期 11月上旬教学计划(11月6日更新)
    .NET 6期 10月下旬教学计划(10月31日更新)
  • 原文地址:https://www.cnblogs.com/qiulinzhang/p/9513673.html
Copyright © 2011-2022 走看看