C++基础与算法

等概率无重复的从n个数中选取m个数

问题描述:程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内的m个随机整数,要求:每个数选择出现的概率相等,且按序输出。

按序逐个选择可以实现按序输出,采用以下方法可以实现等概率选择:
当判断某个数是否选择时,任务的状态为:距离完成还需要选出 n_remain 个数字,而余下的备选目标还有 m_remain 个数,那么我们以 n_remain / m_remain 的概率选择当前数。
n=5, m=2时:

  • 第一个数选择概率为:2/5;(P(X1)=2/5)
  • 若第一个数被选,第二个数选择概率为:1/4;若第一个数没有被选,第二个数选择概率为:2/4;(P(X2) = P(X2|X1)P(X1) + P(X2|ar{X1})P(ar{X1}) = 2/5) --- 全概率公式
  • 以此类推。。。

具体实现时,“以概率p选择”可以转述为:生成0~1的随机数,小于P则选,否则不选;
进一步在C++上实现时,p=x/y,即生成 [0, y) 之间的随机数,小于 x 则选,否则不选;

int gen(int m, int n){
    for(int i = 0; i < n; ++i)
        if(rand() % (n - i) < m) {
            cout << i << endl;
            m--;
        }
    return 0;
}

Tips:产生一定范围随机数的通用表示公式

a + rand() % n;//其中的 a 是起始值,n 是整数的范围。
原文地址:https://www.cnblogs.com/tofengz/p/14597810.html