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 是整数的范围。
    
  • 相关阅读:
    mysql高级查询(转的)
    PHP Content-type 的说明
    在textFieldShouldEndEditing 方法中调用[self.tableView reloadData] 失效问题
    关于navigationcontroller 隐藏navigationBar问题
    iOS证书、签名、安装描述文件
    swift 项目搭建
    定义私有cocoapods 源
    Git 服务器搭建
    UITabelView 介绍
    swift aes 加密
  • 原文地址:https://www.cnblogs.com/tofengz/p/14597810.html
Copyright © 2011-2022 走看看