首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

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

2014-01-08 
####生成随机不重复数的问题publicclassTest{publicstaticvoidmain(String[]args){intn10int[]numnewin

####生成随机不重复数的问题
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

热点排行