给定一个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 }
来源:https://www.cnblogs.com/aLittleBitCool/archive/2012/01/08/2316388.html