把1-n放到一个数组中,然后取下标
第一次 在1~n中随机取, 把取到的和[n-1]交换
第二次 在1~(n-1)中随机取,把取到的和[n-2]交换
第三次 在1~(n-2)中随机取,把取到的和[n-3]交换
...
到第m次 在1~(n-m+1)中随机取,把取到的和[n-m]交换这个数组中的后面m个就是你要的随机数
第一次 在1~n中随机取, 把取到的和[n-1]交换
第二次 在1~(n-1)中随机取,把取到的和[n-2]交换
第三次 在1~(n-2)中随机取,把取到的和[n-3]交换
...
到第m次 在1~(n-m+1)中随机取,把取到的和[n-m]交换这个数组中的后面m个就是你要的随机数
for (int i=0; i < m; i++)
{
Response.Write(r.Next(1,n));
}
Random r = new Random();
for (int i=0; i < n; i++)
{
numbers[i] = r.Next(1,n);
}int tmp,p;
// 取随机数
for(int i=0; i<m; i++)
{
p = r.Next(1,n-i);
// swap numbers[p] and numbers[n-i-1]
tmp = numbers[p];
numbers[p] = numbers[n-i-1];
numbers[n-i-1] = tmp;
}// 你要的不重复的随机数就是数组numbers的后面m个
ArrayList list = new ArrayList();
Random r = new Random();while( list.Count<m )
{
r.Next(1,n);
if( !list.Contains(r) )
list.Add( r );
}int[] values = (int[])list.ToArray( typeof(int) );
这种算法效率会较低一点,
因为判断list.Contans(r)需要消耗时间,尤其是当m,n比较接近(n比较大)
很容易就产生了现在取到的随机数包含在以前取到的随机数内。正因为这样,所以采用了随机取下标、再交换的方法