zoukankan      html  css  js  c++  java
  • C++中随机数和不重复的随机数

    随机数

        int rand ();

        rand函数返回一个0-32767之间的一个伪随机整数,32767可以由宏RAND_MAX表示,该函数需要头文件<stdlib.h>。

        常用的是如何生成一个范围内的随机数,例如想生成0-100之间的随机数,那么我们可以编写如下语句:

     1 #include <stdlib.h>
     2 #include <iostream>
     3 
     4 using namespace std;
     5 
     6 void RAND(int max, int min, int n)
     7 {
     8     for(int i = 0; i < n; ++i)
     9     {
    10         int u = (double)rand() / (RAND_MAX + 1) * (max - min) + min; 
    11         cout << u << " ";
    12     }
    13 }

          第10行是关键,rand()生成一个随机数,通过一系列简单的数学计算将随机范围变到min与max之间。需要注意的是,将rand转化为double类型之后是保证在做除法时得到有效地数字,最后因为u声明为int类型,最后可以保证得到的是整数序列。参数n是随机数的个数。生成0-100的10个随机数的语句为

    RAND(100, 1, 10);

          结果如图,但是这样每次生成的随机数都相同,因此我们需要一种方法来生成不同的随机数。srand()函数用以设定随机数种子,我们知道随机数的产生实际上是从一个伪随机数列中取值,我们通过设置随机数种子,即可以从该伪随机数列的不同位置取值,显示出来就达到了更新随机数的目的。

    void srand( unsigned int seed );

    里面接受一个int数值,一般采取的方式是根据当前系统时间来产生一个数值,用该数值来作为随机数种子,需要头文件<time.h>。

    1 void RAND(int max, int min, int n)
    2 {
    3     srand(time(NULL));
    4     for (int i = 0; i < n; i++)
    5     {
    6         int u = (double)rand() / (RAND_MAX + 1) * (max - min) + min;
    7         cout << u << " ";
    8     }
    9 }

    第三行便更新了随机数种子,得到结果为 ,可以看出随机数有了更新。

    不重复随机数

         从第二次运行的结果来看,我们发现产生了两个90,如果我们想要避免这种情况,即产生的随机数不会重复,那么该如何进行代码的编写?

         最初的思想是每生成一个随机数,便于前面的所有随机数进行比较,如果有重复,则舍去不要,重新选取。但该方法十分费时,并且在数据量巨大的并且有一定限制的时候,会引发巨大问题。例如要生成10000个随机数,范围是0-9999,且不能重复,那么最后几个随机数有可能需要相当长的时间才能筛选出来。

        下面我们从另外一个角度来思考,假设我们已经由一个数组长度为10000的数组,里面分别存储了数据0-9999,我现在的做法是想办法让10000个数进行随机排列,便得到了这样一个随机数列,如果我只要其中的100个数,那么从前面取出100个就好。这里利用algorithm.h里面的一个函数,,来进行简单处理。

    template<class RandomAccessIterator>  
        void random_shuffle(
          RandomAccessIterator _First, 
          RandomAccessIterator _Last
    );

    这个函数操作的对象是容器的迭代器,即我们需要将存储数据从数组变为容器就好了,下面代码实现一下:

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <vector>
     4 
     5 using namespace std;
     6 
     7 void randperm(int Num)
     8 {
     9     vector<int> temp;
    10     for (int i = 0; i < Num; ++i)
    11     {
    12         temp.push_back(i + 1);
    13     }
    14 
    15     random_shuffle(temp.begin(), temp.end());
    16 
    17     for (int i = 0; i < temp.size(); i++)
    18     {
    19         cout << temp[i] << " ";
    20     }
    21 }
    22 
    23 cout << endl;

    给函数传10为,参数,即生成一个从1-10的不重复随机数,结果为:


    上面的方式只是一种,还有很多方式用以产生不重复随机数,有兴趣的朋友可以参考一下下面的连接:

    http://www.hoopercao.com/2011/01/23/%E7%94%9F%E6%88%90%E4%B8%8D%E9%87%8D%E5%A4%8D%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%95%B0%E7%9A%84%E6%96%B9%E6%B3%95/

    http://www.cnblogs.com/afarmer/archive/2011/05/01/2033715.html

    http://www.cnblogs.com/zuisanlang/archive/2011/12/09/2282960.html

  • 相关阅读:
    fpm 打包教程
    fpm 打包工具安装调试
    kubernetes 容器挂载 ceph rbd 卷的平滑扩容方法
    kubernetes ceph-rbd挂载步骤 类型PersistentVolume
    ceph 块设备
    kubernetes 外部访问集群暴露端口服务
    kubernetes job的原理
    国内GIT托管服务
    Euclidean Space
    Struct Member Default Value
  • 原文地址:https://www.cnblogs.com/salan668/p/3652532.html
Copyright © 2011-2022 走看看