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 是整数的范围。
    
  • 相关阅读:
    find命令之xargs
    find命令之exec
    find 命令概览
    mv命令
    locate 命令
    whereis 命令
    linux which 查看可执行文件的位置
    Linux应用总结:自动删除n天前日志
    Visual Studio
    Visual Studio- “无法启动此程序,因为计算机中丢失 xxx.dll尝试重新安装该程序以解决此问题"
  • 原文地址:https://www.cnblogs.com/tofengz/p/14597810.html
Copyright © 2011-2022 走看看