比如要产生1~N之间的随机数,如何让这N个数中的每个数都只出现一次呢?

解决方案 »

  1.   

    楼主我的算法不是说了吗,举个例子(简单点,5个)
    数组int a[]={1,2,3,4,5}
    随机取一个 int i = a[Math.random()*a.length],假设为3
    交换位置
    {1,2,5,4,3}
    取第二个
    i = a[Math.random()*(a.length-1)]//取过的放到最后了,不可能取到了
    明白了吧
      

  2.   

    public static void main(String[] args) {
      
       Set set=new HashSet();
       while(true){
       int ra=(int)(Math.random()*10)+1;
       set.add(new Integer(ra));    if(set.size()==10) break;
       }
          Iterator it=set.iterator();
       while(it.hasNext()){
       System.out.println(it.next().toString());
       } }
      

  3.   

    利用HashSet不能放进重复数值。
      

  4.   

    我得意思是说,如果用Math.random()来取随机数,如果假设用循环语句来取 N 次,怎样保证这N个随机数都不一样(现假设要取的随机数为整数),而不是从数组里面取。
      

  5.   

    如果没有特殊处理
    不可能不重复的
    可以按照上面的说法,
    取一个则放一个到hashset里面,则可以消除重复的
      

  6.   

    //楼主老大,这样不行吗?package com.didoleo.util;import java.util.Arrays;
    import java.util.Collections;
    import java.util.HashSet;
    import java.util.Set;
    /**
     * @author Administrator
     *
     * TODO To change the template for this generated type comment go to
     * Window - Preferences - Java - Code Style - Code Templates
     */
    public class Myrandom { public static void main(String[] args){

    Set set=new HashSet();
    while(true){
    int i=(int)(Math.random()*10)+1;
    set.add(new Integer(i));
    if(set.size()==10){
    break;
    }
    }
    Object[] array=set.toArray();
    Collections.shuffle(Arrays.asList(array));
    for(int i=0;i<array.length;i++){
    System.out.println((Integer)array[i]);
    }

    }


    }
      

  7.   

    //楼主老大大概是这个意思
    public class Myrandom { public static void main(String[] args){

    Set set=new HashSet();
    StringBuffer sb=new StringBuffer("");
    while(true){
    int i=(int)(Math.random()*10);
    set.add(new Integer(i));
    if(set.size()==10){
    break;
    }
    }
    Object[] array=set.toArray();
    Collections.shuffle(Arrays.asList(array));
    for(int i=0;i<array.length;i++){
    //System.out.println((Integer)array[i]);
    sb.append(array[i].toString());

    }
    System.out.println(new String(sb));
    }


    }
      

  8.   

    俺做过队列的,就是一个单向循环链表,一个是value一个是地址,取的时候可能会慢点,不过不会重复啦
      

  9.   

    hashset 那样弄的话速度会很慢的阿,不过random10还算好,但是如果random100可就麻烦了
      

  10.   

    楼主上面都是你想要的东西,believefym已经讲得很清楚了.
      

  11.   

    凑个热闹:
    public void fun07(){
    HashMap map = new HashMap();
    int count=0,max = 10;
    while(count<max){
    int i = (int)(Math.random()*100+1);
    Integer inte = new Integer(i);
    if(map.containsKey(inte)){
    continue;
    }else{
    count++;
    Conica.pl("count "+count+":"+i);
    }
    }
    }
      

  12.   

    我昨天去面试,公司也出了一个与楼主相似的问题.问题是这样子的:
    输出1千个不重复的随机整数,要求整数大于零小于一万.
    若按照hashset()方法的话,那岂不是要很麻烦!