第十二章 取样问题

问题:程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。从概率的角度说,我们希望得到没有重复的有序选择,其中每个选择出现的概率相等。


1.genknuth():
算法依次考虑整数0,1,2,...,n-1,并通过一个适当的随机测试对每个整数进行选择。通过按序访问整数,可以保证输出结果是有序的。
2.gensets():一种解决方案是在一个初始为空的集合里面插入随机整数,直到个数足够,然后排序输出集合中的元素(利用C++中的set容器可以节省排序这一步骤)。
3.genshuffle():生成随机整数的有序子集的另一种方法是把包含整数0~n-1的数组的前m个元素打乱(通过交换数组中的元素),然后把前m个元素排序输出。

4.genfloyd():当m接近n时,基于方法2的方法要丢掉很多随机数,给出一个算法使得在m个步骤之内就可以按要求等概率地生成有序随机数。


// generate m sorted integers in U[0,n)
#include 
   
   
    
    
#include 
    
    
     
     
#include 
     
     
      
       // find() sort()

using namespace std;

int bigrand()
{
    return RAND_MAX*rand()+rand();
}

int randint(int l, int u)
{
    return l+rand()%(u-l+1);
}

int genknuth(int m, int n)
{
    int select=m, remain=n, i;
    for(i=0;i
      
      
       
        S;            // 
    set
       
       
         ::iterator i; // while(S.size() 
        
          S; set 
         
           ::iterator i; int k, j; for(k=n-m;k 
           
          
         
       
      
      
     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值