zoukankan      html  css  js  c++  java
  • 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 是整数的范围。
    
  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/tofengz/p/14597810.html
Copyright © 2011-2022 走看看