读书人

#生成随机不重复数的有关问题

发布时间: 2014-01-08 14:18:52 作者: rapoo

####生成随机不重复数的问题
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 的话 不就重复了,但测试一千万次居然都没重复的,不明白
[解决办法]

引用:
什么叫最多有num[r]和num[n-1]是重复?
这是一次运行中的结果,*前面的是r值,后面的是num数组,重复的多了去了
======1****[1, 10, 3, 4, 5, 6, 7, 8, 9, 10]
======3****[1, 10, 3, 9, 5, 6, 7, 8, 9, 10]
======3****[1, 10, 3, 8, 5, 6, 7, 8, 9, 10]
======0****[7, 10, 3, 8, 5, 6, 7, 8, 9, 10]
======3****[7, 10, 3, 6, 5, 6, 7, 8, 9, 10]
======3****[7, 10, 3, 5, 5, 6, 7, 8, 9, 10]
======1****[7, 5, 3, 5, 5, 6, 7, 8, 9, 10]
======2****[7, 5, 3, 5, 5, 6, 7, 8, 9, 10]
======0****[5, 5, 3, 5, 5, 6, 7, 8, 9, 10]
======0****[5, 5, 3, 5, 5, 6, 7, 8, 9, 10]

不知我是不是把问题看错了 ,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

读书人网 >J2EE开发

热点推荐