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

给定一个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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值