随机数算法之从N个数中取M个数

算法描述如下:从M个数中选出N个数来(0<N<=M),要求N个数之间不能有重复。


分两种情况:
1.n>>m时 

 repeat 
        Randomize;                   //初始化随机数 
        a:=Random(n-1)+1;     //如果n=50,0 <=Random(50-1) <=49 
        b:=Random(n-1)+1; 
        c:=Random(n-1)+1; 
    until   (a <> b)   and   (b <> c)   and   (a <> C) 


2 m接近n时,随机抽取一个,如果重复了,重新抽取一次。缺陷是需要对比。

进一步做法:每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。

另外一种不使用数组而使用可变集合的办法,这种算法的做法是使用了之后马上从源集合中清除掉(数组是没有办法这么做的),因而也是可以做到生成不重复的随机数的。



转载于:https://www.cnblogs.com/catkins/archive/2012/10/11/5270744.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值