####生成随机不重复数的问题
public class Test
{
public static void main(String[] args)
{
int n=10;
int[] num = new int[n];
for(int i=0;i <num.length;i++)
num[i] = i+1;
int[] arr = new int[10];
for(int i=0;i <arr.length;i++)
{
int r =(int)(Math.random()*n);
arr[i]=num[r];
num[r]=num[n-1];
n--;
}
for(int i=0;i <arr.length;i++)
System.out.print(arr[i]+" ");
}
}
它为什么能够生成不重复的,有点搞不明白,若前3次r是9,9,0 的话 不就重复了,但测试一千万次居然都没重复的,不明白
[解决办法]
不知我是不是把问题看错了 ,arr才是最终数组吧(不是问它为什么不重复吗),num[r]和num[n-1]重复,就是说 当你r=1的时候num数组中num[r]和num[n-1]值相等
[解决办法]
后面的代码还在分析
// Math.radom 值范围 [0 , 1),随着n的递减,r值范围也会减小不会出现r 为 9,9 的情况
// 第一次 r 范围0-9
// 第二次 r 范围0-8
// ...
// 第九次r 范围 0-1
// 第十次 r 范围 0-0 即 0
int r =(int)(Math.random()*n);
[解决办法]
for(int i=0;i <arr.length;i++)
{
int r =(int)(Math.random()*n);
arr[i]=num[r];
num[r]=num[n-1];
n--;
}
第一次n=10,r=0...9,假如是4,arr[0]=num[4]=5,而num[4]=num[9]=10,n=9了
所以每次操作后num[0]至num[n]的数都是不重复的,故循环完后,arr[0...9]的值就是1...10中的不重复值。
而楼主说“前3次r是9,9,0 的话 不就重复了”这是不存在的,应为n每次减1