zoukankan      html  css  js  c++  java
  • C/C++产生随机数

    C语言/C++怎样产生随机数:这里要用到的是rand()函数, srand()函数,C语言/C++里没有自带的random(int number)函数。
    (1)  如果你只要产生随机数而不需要设定范围的话,你只要用rand()就可以了:rand()会返回一随机数值, 范围在0至RAND_MAX 间。RAND_MAX定义在stdlib.h, 其值为2147483647。

    rand()函数产生的是一个随机整数。

     

    1 = rand() % 100;         // v1 in the range 0 to 99
    v2 = rand() % 100 + 1;     // v2 in the range 1 to 100
    v3 = rand() % 30 + 1985;   // v3 in the range 1985-2014

     

    例如:

    #include<stdio.h>
    #include<stdlib.h>
    void main()
    {
           for(int i=0;i<10;i+)
                 printf("%d\n",rand());
    }

    (2)  如果你要随机生成一个在一定范围的数,你可以在宏定义中定义一个random(int number)函数,然后在main()里面直接调用random()函数:

    例如:随机生成10个0~100的数:
    #include<stdio.h>
    #include<stdlib.h>
    #define random(x) (rand()%x)
    
    void main()
    {
         for(int x=0;x<10;x++)
               printf("%d\n",random(100));
    }
    
     

    (3)但是上面两个例子所生成的随机数都只能是一次性的,如果你第二次运行的时候输出结果仍和第一次一样。这与srand()函数有关。srand()用来设置rand()产生随机数时的随机数种子。在调用rand()函数产生随机数前,必须先利用srand()设好随机数种子(seed), 如果未设随机数种子, rand()在调用时会自动设随机数种子为1。上面的两个例子就是因为没有设置随机数种子,每次随机数种子都自动设成相同值1 ,进而导致rand()所产生的随机数值都一样。

    srand()函数定义 : void srand (unsigned int seed); 
    通常可以利用geypid()或time(0)的返回值来当做seed
    如果你用time(0)的话,要加入头文件#include<time.h>

    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #define random(x) (rand()%x)
    
    void main()
    {
    
         srand(time(0));//或srand(time(NULL)); NULL 0一样
         for(int x=0;x<10;x++)
               printf("%d\n",random(100));
    }

     要想取得[a,b)之间的随机整数,使用(rand()%(b-a))+ a,结果包含 a 而不含 b 。

    void srand(unsigned int seed)

    If seed is set to 1, the generator is reinitialized to its initial value and produces the same values as before any call torand or srand.  srand函数介绍http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

     

     srand(unsigned(time(NULL)))应该放哪里呢?

    答案是:放在所有循环的外面,也即函数的开头。

    这是由于C++运行速度太快,基本上小型的循环瞬间就可以搞定,而Time(NULL)的刷新频率是一秒,所以准确的答案应该是:放在运算速度在一秒以上的那层循环里。

    下面的程序:

    int main()
    {
        for(int i=0;i<5;i++)
        {
            srand((unsigned)time(NULL));
            cout<<rand()%5<<ends;
        }
    }

    每次输出的都是相同的数,为什么?

    因为循环内运行时间太短了,导致每次循环的时间time 种子都几乎一样,所以rand()产生的值一样。

    遵循下面的原则:

     srand((unsigned)time(NULL)) 
    放的地方离rand“远一点”,即两句执行的间隔大点,
    比如不要把srand和rand同放在一个循环里,这样时间上基本没变,
    所取的种子是相同的。
    所以结果一样

    上面的应该改成:

    int main()
    {
        srand((unsigned)time(NULL));
    
        for(int i=0;i<5;i++)
        {
            
            cout<<rand()%5<<ends;
        }
    }

    上面的只是保证每次运行程序得到的随机序列不一样,每次产生的随机序列都是根据第一个数推出来的,因为用的是线性同余法。

    r(n+1)是根据r(n)推出来的。

    下面的程序可以保证每次产生的随机序列没有规律;

    #include<iostream>
    #include<ctime>
    #include<cmath>
    #include<Windows.h>
    using namespace std;
    
    int main()
    {
        
    
        for(int i=0;i<5;i++)
        {
            srand((unsigned)time(NULL));
            Sleep(1000);
            cout<<rand()%5<<ends;
        }
    }

    利用Sleep(1000)使每次循环时间都大于1秒,这样每次的time seed种子就是不同的了。

    参考:http://www.myexception.cn/cpp/280329.html

    http://bbs.csdn.net/topics/310169092

  • 相关阅读:
    vscode终端无法使用webpack命令
    vscode 常用配置
    git中fatal: Authentication failed的问题
    vue项目初始化步骤
    Windwos安装Node.js和npm的详细步骤
    node安装教程,全局安装vue,webpack/cli,创建一个vue项目(详细步骤)
    VsCode 自动生成文件头部注释和函数注释
    微信小程序使用字体图标
    微信小程序第三方框架
    查看最近访问的文件目录或文件
  • 原文地址:https://www.cnblogs.com/youxin/p/2470183.html
Copyright © 2011-2022 走看看