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 是整数的范围。
    
  • 相关阅读:
    property里的参数
    property关键字的理解
    OC与C语言的几点区别
    C语言学习心得
    QQ第三方<接口>
    为什么选择Redis
    版本控制器
    url传参及重定向
    开发的四个环境
    Paxos分析
  • 原文地址:https://www.cnblogs.com/tofengz/p/14597810.html
Copyright © 2011-2022 走看看