在做随机数算法时,我要生成10个4位随机数,并且每个随机数的每一位都互不重复,我的程序代码如下,用了两个循环,先生成4个小于10的数字,并放于数组,让这四个数不重复,然后把这四个数 StringBuffer-->string-->Integer-->int,第二个循环用来生成这样的10个数,可是大部分可以实现,但是,还有少部分有重复:代码和结果如下:
mport java.util.Random;public class Random8 { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub Random random = new Random();
int[] n = new int[4];
int i, j, m;
int target;
int total = 10;
// 用来判断生成的个数
for (m = 0; m < total; m++) {
StringBuffer sBuffer = new StringBuffer();
for (i = 0; i < 4; i++) {
// 避免首位为0
target = random.nextInt(8) + 1;
for (j = 0; j < i; j++) {
/*如果相等,就重新生成
我就纳闷,如果一直相等呢?
因为我生成的还有重复的,*/
if (target == n[j]) {
target = random.nextInt(7);
j = 0;
}
}
n[i] = target; sBuffer.append(n[i]); }
int s_to_4 = Integer.parseInt(sBuffer.toString());
System.out.println(s_to_4);
} }}结果:
3581
5148
6436
7154
2460
8231
1681
3421
5213
6456
难道第二个循环判断错了,不懂,望高人指教!!!

解决方案 »

  1.   


    import java.util.ArrayList;
    import java.util.List;
    import java.util.Random;class TEST { public static void main(String args[]) {
    System.out.println(getRandonNumber());
    } public static List<Integer> getRandonNumber() {
    List<Integer> list = new ArrayList<Integer>();
    Random random = new Random();
    int temp;
    for (int i = 0; i < 4; i++) {
    temp = random.nextInt(9001) + 999;
    if (flg(temp, list))
    list.add(temp);
    }
    return list;
    } public static boolean flg(int n, List<Integer> list) {
    boolean flg = true;
    for (int i = 0; i < list.size(); i++)
    if (n == list.get(i))
    flg = false;
    return flg;
    }
    }
      

  2.   


    import java.util.Iterator;
    import java.util.LinkedHashSet;
    import java.util.Set;
    public class Example
    {
    /**
     * 获取[start,end]中的一个随即整数
     * @param start
     * @param end
     * @return
     */
    private static int getRandom(int start, int end)
    {
    return Double.valueOf(Math.random() * (end - start + 1)).intValue() + start;
    }

    private static void random()
    {
    Set<Integer> set = new LinkedHashSet<Integer>();

    while (set.size() < 4)
    {
    if (set.size() == 0)
    {
    set.add(getRandom(1, 9));
    }
    set.add(getRandom(0, 9));
    }

    StringBuffer buf = new StringBuffer(4);

    Iterator<Integer> it = set.iterator();

    while (it.hasNext())
    {
    buf.append(it.next());
    }

    System.out.println(Integer.valueOf(buf.toString()));
    }

    public static void main(String[] args)
    {
    for (int i = 0; i < 10; i++)
    {
    random();
    }
    }
    }
      

  3.   


    import java.util.*;   
    public class Randoms {   
        public static void main(String[] args) {   
    for(int i=0; i<10; i++) {
    System.out.println(getNumber());
    }
        }  
        
        public static int getNumber() {
         int [] seed = {0,1,2,3,4,5,6,7,8,9};
         int [] ranArr = new int[4];
         Random ran = new Random();
         int result = 0;
         for(int i = 0 ; i<4 ;){                         
                int j = ran.nextInt(seed.length-i); 
                if(j==0 && i==0)continue;                 
                ranArr [i] = seed [j];   
                seed [j] = seed [seed.length-1-i];       
                result = result*10 + ranArr[i];          
                i++;  
          }
            return result;  
        }
    }  
      

  4.   

    java.util.Random ran=new java.util.Random();
    方法一:
    java.util.Set<Integer> set=new java.util.HashSet<Integer>();
    for(;set.size()<10;)
    {
       int n=ran.nextInt(9000)+1000;//nextint(9000)产生的是<=0,<9000的一个随机数
        set.add(n);//HashSet里的元素不是会重复的。重复的元素插入不进去
    }
    方法二:
    java.util.List<Integer> list=new java.util.ArrayList<Integer>();
    for(;list.size()<10;)
    {
    int n=ran.nextInt(9000)+1000;
    if(!list.contains(n))//如果n不包涵在list中的话,才把n添加到list集合里边去
    list.add(n);
    }
      

  5.   

    大家都做的不错,自己认为采用SET集合比较好,散分