0 .. n-1个数中随机选m个数

拥有回忆 提交于 2020-02-02 00:10:48

给定一个n, 一个m, 要求从0..n-1个数中随机选取m个数。

 

这里参考《编程珠玑》中的一个方法,既利用概率测试来进行选取。假设我们要从0到100中选取10个数。首先考虑0,我们选取它的概率为10/100 = 1/10,因此我们可以产生一个随机数(应该远远大于n),利用该数模100的值是否小于10来模拟选取0的情况。接着考虑1,这时我们应该根据0是否被选取来考虑其被选中的概率。

 

给出代码,补充了书中的bigrand的实现以及循环做了一点点改动。

 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4  5 int range_num; 6  7 unsigned int bigrand(void){ 8     srand(time(NULL)); 9     return (unsigned int)(100 * range_num * rand());10 }11 12 int main(void){13     int m = 10, n = 1000;    14     int i, remaining = n, select = m;15 16     range_num = n;17 18     for(i = 0;i < n && select > 0;i++){19         if(bigrand() % remaining < select){20             select --;  21             printf("%d ",i);22         }   23         remaining--;24     }   25     26     printf("\n");27     return 0;28 }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!