java生成数字而不重复没有arraylist

时间:2013-12-15 23:18:34

标签: java arraylist shuffle

我知道通常的洗牌方式列表; 是否有另一种模仿shuffle为Array(NOT Lists)做的方法? 我已编写适用于rand.NextIntIF以及while的内容的代码; 但我非常怀疑这是最有效的方式。 任何考虑低资源的想法?

这是我得到的;但我怀疑效率:

       static int[] order = new int[] {1,2,3,4};
       static int[] order2 = new int[] {0,0,0,0,0};
       static int p;
        Random rand = new Random(); 
    int m=global.order[rand.nextInt( global.order.length)];
    global.order2[m]=m;

    int n=global.order[rand.nextInt( global.order.length)];
    while ( m==n )  { n=global.order[rand.nextInt( global.order.length)];}
    global.order2[n]=n;

    int o=global.order[rand.nextInt( global.order.length)];

    while (m==o || n==o) { o=global.order[rand.nextInt( global.order.length)]; }
    global.order2[o]=o;
    for (int y=1; y<=4; y++){
        if (global.order2[y]!=m && global.order2[y]!=n && global.order2[y]!=o){
            global.order2[y]=y;
            global.p=y;

3 个答案:

答案 0 :(得分:1)

使用Fisher-Yates shuffle(Wikipedia

您可以轻松地遵循本指南来创建自己的Java实现:

  1. r
  2. 范围中选择一个随机整数[0..array.length)
  3. 交换array[0]array[r]
  4. r
  5. 范围中选择一个新的随机整数[1..array.length)
  6. 交换array[1]array[r]
  7. 等等。这很容易转换为循环。性能良好,无需重新分配数组或线性创建新对象和执行时间。

答案 1 :(得分:0)

如果您需要的是带有随机生成值的未排序集,请考虑使用HashSet。

要使用普通数组实现此操作,您在数组中的插入将需要O(n)时间,因为您需要查看所有元素以查看它是否已包含随机数。使用HashSet插入将O(1)。然后,您可以将其转换为数组。

import java.util.Arrays;
import java.util.HashSet;

public class MakeUnsortedSet {

    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();

        while (set.size() < 10) {
            set.add((int)(Math.random() * 20)); 
        }

        Integer[] ints = new Integer[10];
        set.toArray(ints);

        System.out.println(Arrays.toString(ints));
    }
}

答案 2 :(得分:0)

实质上,ArrayList只是List接口实现中的常规数组。如果您认为自己可以提出更好的实施方案以满足您的绩效需求,只需实施自己的List并将其传递给Collections.shuffle()

如果你想避免为每个数组实例化List实现的新对象,你可以用这样的方式实现它,你只能替换对包装数组的引用并进行微小的修改。

无论如何,在尝试重新发明轮子之前,我会首先查看ArrayList的源代码(可能是extends)。