小培

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

 

解决方法1:找一个随机数,在没有被筛选出来的数字里面求模,然后输出。当还剩5个数字时,每个元素的概率为20%,选出一个,每个元素的概率为25%。这样对于选出的每个元素来说,都是平等的。
void genkunth(int m,int n)
{
    for(int i=0;i<n;i++)
    {
        /*selectm of remaining n-i*/
        if((bigrand()%(n-i))<m)//
        {
           count << i << "\n";
           m--;
        }
    }
}

解决方法2:在一个初始为空的集合里面插入随机整数,直到个数足够。然后按照顺序输出。
void gensets(int m,int n)
{
   set<int> S;
   while(S.size()<m)
        s.insert(bigrand()%n);
   set<int>::iteratori;
   for(i=S.begin();i!=S.end();++i)
        count<< *i << "\n";
}

解决方法3: 把0~n-1的数组顺序打乱,然后把前m个元素输出。其实只需要打乱数组的前m个元素就可以。
void genshuf(int m,int n)
{
    int i,j;
    int *x = new int[n];
    for(i=0;i<n;i++)
        x[i]=i;
    for(i=0;i<m;i++)
    {
        j= randint(i,n-1);
        int t =x[i]; x[i] = x[j];x[j]=t;
    }
    sort(x,x+m);
    for(i=0;i<m;i++)
        count<<x[i]<<"\n";
}


特殊情况:
如果n为100万而m为n-10时, 生成一个包含10个元素的有序随机样本,然后输出不在样本中的整数。
如果m为1000万而n为2的31次方,先生成1100万个整数,然后排序并对其扫描以删除重复的元素,最后得到一个有1000万元素的有序样本。(这一条不太理解,思考中)

posted on 2010-11-08 18:45  小培  阅读(407)  评论(0)    收藏  举报