高效产生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]);
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);
3 $arr[$i] = $i;
4 }
5 $arr = array_rand($arr,20);