高效产生m个n范围内的不重复随机数(m<=n)

   如何产生不重复的随机数?最容易想到的方法,是逐个产生这些随机数,每产生一个,都跟前面的随机

数比较,如果重复,就重新产生。这是个很笨的方法,且比较次数呈线性增长,越往后次数越多。其实这些

比较是多余的,完全可以不进行比较,只要反过来,按顺序产生这些数,但随机产生它们的位置。例如下

面产生100个100以内不重复随机数的代码:  

C代码: 

int a[100];
for(i=0; i<=99; ++i) a[i]=i;
for(i=99; i>=1; --i) swap(a[i], a[rand()%i]);

上面这段代码只需要遍历一次就可以产生这100个不重复的随机数,它是如何做到的呢?首先第二行按顺

序用0到99填满整个数组;第三行,是随机产生从0到m-2个数组下标,把这个下标的元素值跟m-1下标的元

素值交换,一直进行到下标为1的元素。因此它只需要遍历一次就能产生全部的随机数。

原文:http://blog.csdn.net/megaboy/article/details/524221 

 该版本应该是通用型的吧,下面来个PHP版本的,利用array_rand函数

 PHP代码:

 1 $arr = array();

2 for($i=0; $i<=99; $i++) {
3     $arr[$i] = $i;
4 }
5 $arr = array_rand($arr,20);
原文地址:https://www.cnblogs.com/yimu/p/2689341.html