算法描述如下:从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个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。
另外一种不使用数组而使用可变集合的办法,这种算法的做法是使用了之后马上从源集合中清除掉(数组是没有办法这么做的),因而也是可以做到生成不重复的随机数的。
综合参考的原址:http://topic.csdn.net/t/20030521/12/1813166.html
http://zhoufoxcn.blog.51cto.com/792419/163942