zoukankan      html  css  js  c++  java
  • C++随机数的使用方法

         学过别的高级语言的都知道,产生随机数用的都是相似于random这种字符,c++也不例外,在C++中使用的是rand()函数,可是不同的是,假设在C++中仅仅使用了比如 "int i;i=rand();"这样,使用程序会发现每次得到的随机数都是一样的,据了解在C++中这样做是为了方便调试。假设要每次都长生不同的随机数,我们则须要在C++中加上"srand(time(NULL));"这条语句,他的作用是以时间为种子,产生随机数(我们都知道时间是在不断变化的,但两次获取随机数要在1秒后,否则数值还是一样),以下看个样例。
        该样例是:在1~100内生成一个随机数,并指定一个数,显示出该数在产生多少个数后出现。程序代码例如以下:

    #include <iostream>
    #define fnum 56               //要找的数为56

    using namespace std;
    int main()
    {
      int num=0,j,k=0;
      int get_rand(); 
       srand(time(0));
       for(j=1;num!=fnum;j++,k++)          

      {
          num=get_rand();
        if(num<10)                 //右对齐
              cout<<" "<<num<<"  ";    
            else
              cout<<num<<"  ";
           
           
         if(j==15)                 //每行15个数
            {
              putchar('n');
              j=0;
            }
       }
        cout<<'n'<<"数字"<<fnum<<"已经找到,共生成了"<<k<<"个随机数。"<<endl;

    return 0;
    }

    int get_rand()
    {
      int i;
      i=rand()%100+1;
      return i;   
    }

    ///////////////////////////////////////

            所谓的“伪随机数”指的并非假的随机数,这里的“伪”是有规律的意思。事实上绝对的随机数仅仅是一种理想状态的随机数,计算机仅仅能生成相对的随机数即伪随机 数。计算机生成的伪随机数既是随机的又是有规律的 —— 一部份遵守一定的规律,一部份则不遵守不论什么规律。比方“世上没有两片形状全然同样的树叶”,这正点到了事物的特性 —— 规律性;可是每种树的叶子都有近似的形状,这正是事物的共性 —— 规律性。从这个角度讲,我们就能够接受这种事实了:计算机仅仅能产生伪随机数而不是绝对的随机数。

            C++中的标准库<cstdlib>(包括在<iostream>中)提供两个帮助生成伪随机数的函数:rand()和srand()。
    函数一:int rand(void);
    从srand(seed)中指定seed開始,返回一个范围介于[seed,RAND_MAX(0x7fff))的随机整数
    函数二:void srand(unsigned seed);
    參数seed是rand()的随机种子,即用来初始化rand()的起始值。

        系统在调用rand()之前都会自己主动调用srand(),假设用户在rand()之前曾调用过srand()给參数seed指定了一个值,那么rand ()就会将seed的值作为产生伪随机数的初始值;而假设用户在rand()前没有调用过srand(),那么rand()就会自己主动调用srand (1),即系统默认将1作为伪随机数的初始值。

        由上述可得知,假设希望rand()在每次程序执行时产生的值都不一样,必须给srand(seed)中的參数seed指定一个变值,这个变值必须在每次 程序执行时都不一样(比方到眼下为止流逝的时间);假设我们给seed指定的是一个定值,那么每次程序执行的时候,rand()产生的随机数都会一样,仅仅 只是这个值是[seed,RAND_MAX(0x7fff))范围中的一个随机取得的值。

        举几个样例说明一下,假设我们要取得0~6之间的随机数(不包括6本身):
    程序一(没有指定seed的值):
    for(int i=0;i<10;i++)
    {
    ran_num=rand()%6;
    cout<<ran_num<<“ ”;
    }
    每次执行程序一都将输出:5 5 4 4 5 4 0 0 4 2

    程序二(指定seed为1):
    srand(1);
    for(int i=0;i<10;i++)
    {
    ran_num=rand()%6;
    cout<<ran_num<<“ ”;
    }
    每次执行程序二都将输出:5 5 4 4 5 4 0 0 4 2,跟程序一的结果全然一样。

    程序三(指定seed的值为6):
    srand(6);
    for(int i=0;i<10;i++)
    {
    ran_num=rand()%6;
    cout<<ran_num<<“ ”;
    }
    每次执行程序三都将输出:4 1 5 1 4 3 4 4 2 2,尽管值跟程序二不一样,只是每次执行时的结果也都同样。

    程序四(指定seed的值为当前系统流逝了的时间,单位为秒(time_t time(0))):
    #include<ctime>
    ……
    srand((unsigned)time(0));
    for(int i=0;i<10;i++)
    {
    ran_num=rand()%6;
    cout<<ran_num<<“ ”;
    }
        执行程序四的时候,第一次输出:0 1 5 4 5 0 2 3 4 2,第二次输出:3 2 3 0 3 5 5 2 2 3,... ...每次的执行结果都不一样,由于每次启动程序时的时刻都不同。

    关于time_t time(0)
        time_t 被定义为长整型,它将返回从1970年1月1日零时零分零秒到如今所经历过的时间,单位为秒。比方输出 cout<<time(0) ,将得到值约为1169174701,约等于37(年)* 365(天)* 24(小时)* 3600(秒)(月和日不计)。

    关于ran_num=rand()%6
        将rand()的返回值与6求模是必须的,这样才干确保目的随机数落在[0,6)之间,否则非常可能会得到一个非常巨大的数值 (RAND_MAX一般为32767)。一个通用的公式是:要想取得[a,b)之间的随机整数,使用(rand()%(b-a))+ a,结果包括 a 而不含 b 。

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 蓝桥杯 算法提高 小X的购物计划
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java实现 第十一届 蓝桥杯 (高职专科组)省内模拟赛
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    Java 第十一届 蓝桥杯 省模拟赛 小明的城堡
    129. Sum Root to Leaf Numbers
    117. Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4050869.html
Copyright © 2011-2022 走看看