在Java中高效地生成随机非重复数列表

在Java中高效地生成随机非重复数列表,java,random,Java,Random,我需要在Java中尽可能高效地生成0到1000之间的非重复随机数列表。我现在只有2个想法,我想知道是否还有其他更好的想法,如果没有,我应该使用以下哪些想法 生成一个介于0和1000之间的随机数r,并将其添加到索引r处另一个名为randomArray[r]的数组中 生成另一个随机数,并检查randomArray[r]是否尚未存储先前生成的随机数 继续走,直到我做完 生成数组并用其索引填充其元素 疯狂地洗牌(还有,我怎样才能有效地洗牌?) 使用数组中从头开始的元素值 谢谢 方法以相等的可能性

我需要在Java中尽可能高效地生成0到1000之间的非重复随机数列表。我现在只有2个想法,我想知道是否还有其他更好的想法,如果没有,我应该使用以下哪些想法

    • 生成一个介于0和1000之间的随机数r,并将其添加到索引r处另一个名为randomArray[r]的数组中
    • 生成另一个随机数,并检查randomArray[r]是否尚未存储先前生成的随机数
    • 继续走,直到我做完
    • 生成数组并用其索引填充其元素
    • 疯狂地洗牌(还有,我怎样才能有效地洗牌?)
    • 使用数组中从头开始的元素值
  • 谢谢

    方法以相等的可能性洗牌列表。创建一个列表并将值从0添加到1000。然后使用此方法洗牌列表

    List l = new ArrayList();
    for(int i = 0; i <= 1000; i++)
        l.add(i);
    
    Collections.shuffle(l); 
    
    listl=newarraylist();
    
    对于(int i=0;i请尝试使用
    LinkedHashSet
    (请参阅)

    常规的
    HashSet
    有效地存储一组
    Integer
    s:放置一个新的数字并检查一个数字是否已经存在是在固定时间内完成的(如您所述,将数字存储在数组中时,这些查找需要线性时间进行检查)

    现在,既然你说你想要一个数字列表,我们就使用一个
    LinkedHashSet
    ,它具有常规
    HashSet
    的所有属性,并且还保证如果你在元素上循环,你将始终以相同的顺序遍历它们

    代码如下所示:

    Set<Integer> randomNumberList = new LinkedHashSet<Integer>();
    
    int r;
    
    // Make sure the number is not present in the list, and then add it:
    do {
      r = ... // Generate your next random number
    } while( randomNumberList.contains(r) );
    
    // At this point, we know r is not in the list, so add it:
    randomNumberList.add(r);
    
    // Do the previous as many times as you want.
    
    // Now, to iterate over the list:
    for(Integer number : randomNumberList) {
      // Do something...
    }
    
    Set randomNumberList=newlinkedhashset();
    INTR;
    //确保列表中不存在该号码,然后添加该号码:
    做{
    r=…//生成下一个随机数
    }而(randomNumberList.contains(r));
    //此时,我们知道r不在列表中,因此添加它:
    randomNumberList.add(r);
    //前一步你想做多少次就做多少次。
    //现在,要迭代列表:
    for(整数:randomNumberList){
    //做点什么。。。
    }
    

    请注意,
    do
    -
    while
    循环是必要的,如果你想确保你真的在列表中添加了一个数字。

    Gee,我不记得今天已经看到这个问题了,而且已经快午夜了!一个新记录!建议编辑:
    newarraylist(1001);
    为什么是1001而不是1000?@QuinnLiu因为从0到1000有1001个数字:p