zoukankan      html  css  js  c++  java
  • 求指定范围里的不重复的N个随机数

      原本是朋友问了一个题目,怎样把1到25个整形数随机排列,想了想,换个意思就是说如何把25个数随机不重复显示出来,即求1—25中25个随机数的一个数组。最简单的方法即利用双循环,是在每次得到一个随机数后,将该随机数放到结果集数组中去对比,是否存在该数,存在则另外取一个随机数,直到是原本数组中不存在的。

      上代码:两循环去重

     1     public static int[] random(int min,int max,int n){  思想很简单,也容易实现,只需注意一下随机数生成的区间即可
     2         if(max-min<n || max<min){
     3             return null;
     4         }
     5         int[] result=new int[n];
     6         Random rand=new Random();
     7         for(int i=0;i<n;){
     8             int flag=1;
     9             int a=rand.nextInt(max-min+1);
    10             for(int j=0;j<=i;j++){
    11                 if(result[j]==a){
    12                     flag=0;
    13                     break;
    14                 }
    15             }
    16             if(flag==1){
    17                 result[i++]=a;
    18             }
    19         }
    20         return result;
    21     }

      第二种方法,思想是每取一个数,则将该数剔除随机数选择的区间里面。比如有一个数组,用来存放区间数,然后随机生成一个区间数组里的下标,则将该下标对应的数放到结果数组中,然后令该随机数对应的数替换为区间数组的其他的数,这样每次区间选择的范围则变化,选得数就不会重复。

      举一个例子来说,有一个源数组,source[0......24],存放的是要求的区间随机数区间【1.....25】,然后随机生成一个下标在[0...24]的索引数index,将该索引数对应的数放到结果数组result[0],这得到第一个数,然后需要把index对应的数给去除,不能直接说剔除这个索引,这是不现实的,我们做到的是把该值给替换掉。因此,我们拟定一个规则,每次索引随机数对应的值替换成result[length]的值,并且替换后,length--,这样就能保证每次源数组中的值都是没有选到的值。具体见代码。

      

     1     public static int[] randomfromArray(int min,int max,int n){
     2         if(max-min<n || max<min){
     3             return null;
     4         }
     5         int[] source=new int[max-min];    
     6         int[] result=new int[n];
     7         int length=max-min+1;        //源数组长度
     8         for(int i=min;i<min+n;i++){    //得到源数组
     9             source[i-min]=i;
    10         }
    11         Random rd=new Random();
    12         for(int j=0;j<n;j++){
    13             int index=rd.nextInt(length--);    //每次随机数索引的选择区域是[0,length),得到后length--,
    14             result[j]=source[index];        
    15             source[index]=source[length];     //完成赋值后将index对应的数换掉为length。这样保证每次数更新把最右边的更新到当前被选择的数中。
                                   //每次都有数被选中
    16 } 17 return result; 18 }
        源数组s[0]=0 s[1]=1 s[2]=2 s[3]=3 s[4]=4 s[5]=5,length=6
        我们假设第一次选得是length-1为索引值,即index为5,那么将s[index]赋给r[0],然后length-1,为5,然后s[5]=s[5],
        s[0]=0 s[1]=1 s[2]=2 s[3]=3 s[4]=4 length=5
        接下来length=5,选择的区间是[0-5),假设index为2,并且length-1,然后r[1]=s[2],然后s[2]=s[length],即s[2]=s[4];
        s[0]=0 s[1]=1 s[2]=4 s[3]=3 length=4

      

    jeyfang
  • 相关阅读:
    【美菜网】PostgreSQL与MySQL比较
    MySQL数据库MyISAM和InnoDB存储引擎的比较
    【美菜网】in和exist区别
    【美菜网】on、where以及having的区别
    hive 行列转换
    postgresql 发生锁表时的解锁操作
    postgre 中获取某个字段最小的另一个字段的记录
    关于带分区hive表添加字段如何避免插入的新字段数据为null
    git使用入门
    怎么绕过前端的判断提交
  • 原文地址:https://www.cnblogs.com/jeyfang/p/5311218.html
Copyright © 2011-2022 走看看