zoukankan      html  css  js  c++  java
  • 10,随机等概率的输出m个不重复的数

    今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m)。遂记录下来。

    首先,产生随机数,不免要用到srand,rand函数。先简单介绍下两个函数。

    1,void srand(unsigned int seed);

       初始化随机数生成器,对于每一个不同的seed,每一次调用rand()将会产生不同的随机数序列。

      特别的,当seed == 1时,生成器将会被重新初始化以前的初始化值,那么下次rand产生的随机数将会和第一次rand()相同。

      所以,为了产生真正的随机数,srand()一般用time(0)来初始化seed。

    2, int rand(void)

      产生一个0~RAND_MAX的随机数,而产生随机数的算法依赖种子seed。如果要产生一个特点区间的随机数,则可以用modulo的方法

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

    3,等概率产生随机数的方法

      先上代码。

    knuth (int n, int m) {
        srand((unsigned int)time(0);
        for (int i = 0; i < n; ++i) {
            if (rand()%(n-i) < m){
                cout << i << endl;
                m--;
            }
        }
    }

      由这个for循环循环n次,且在满足条件时才输出i,可知,输出m个不同值的要求已满足,因为每次输出的都是i值,而i值每次都是不一样的,m--保证了程序在输出了m个值后就停止循环。

      在i=0时,rand()%(n-i)的取值范围为0到n-1,共n个数,此时要输出0只需要rand()%(n-i)小于m,故i=0被输出的概率为m/n;
      在i=1时,rand()%(n-i)的取值范围为0到n-2,共n-1个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);由概率论的知识,可知此时i=1被输出的概率为
    P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;以此类推,可知每个数被输出的概率都为m/n
  • 相关阅读:
    檢查 cpu 的全部 gpio 狀態及設定
    device tree 負值 property 寫法
    shell script timer and 無限迴圈
    vim 搜尋取代功能
    英国人是这样“造”单词的
    计划时间程序
    程序猿的崛起,一篇文章看懂编程语言
    如何读懂计算机(二进制)
    为什么计算机上能看到动人的图片,精彩的视频和悦耳的音乐?(二进制)
    格式化时间用了YYYY-MM-dd,元旦当天老板喊我回去改Bug!(转载)
  • 原文地址:https://www.cnblogs.com/letgo/p/5829251.html
Copyright © 2011-2022 走看看