码迷,mamicode.com
首页 > 其他好文 > 详细

随机生成0到n之间的m个数

时间:2015-03-31 09:06:57      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:c   编程   c++   数据结构   算法   

分析:使用knuth算法:

void PutRand(int n,int m)  
{  
    srand(time(NULL));  
    for (int i=0;i<n;i++)  
    {     
        if(rand()%(n-i)<m)  
        {  
            cout<<i<<endl;  
            m--;  
        }   
    }  
}

证明:

1、当i=0时,则生成的随机数是0,1,2...n-1之间的数,共n个;这是0被选到的概率为m/n。

2、当i=1时,生成的随机数是0,1,2...n-2之间的数,共n-1个;假设上次0被选到,那么这次1被选中的概率为(m-1)/(n-1),假设上次0没有被选到,那么这次1选到的概率为m/(n-1)。因此这次1被选中的概率为[m/n]*[(m-1)/(n-1)]+[(1-m/n)]*[m/(n-1)]=[m*(m-1)]/[n*(n-1)]+[(n-m)/n]*[m*(n-1)]=(m^2-m)/[n*(n-1)]+(n*m-m^2)/[n*(n-1)]=(n*m-m)/[n*(n-1)]=m/n。和第一次的概率相同。

3、可得,第i次产生i的概也为m/n,符合题意。

其他方法略。

随机生成0到n之间的m个数

标签:c   编程   c++   数据结构   算法   

原文地址:http://blog.csdn.net/a809146548/article/details/44759393

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!