在阵列中混洗元素(Java)

时间:2015-02-28 07:14:17

标签: java arrays shuffle

我需要一个shuffle方法来重排一个数组的元素,该数组保存来自另一个类的对象。目前我编写此代码首先使用整数进行测试,但似乎无法正常工作。大多数元素都是重复的。 有人可以发现错误吗? 并且还提出了一种更有效的方法。 我不确定我是否可以使用collections.shuffle,因为我稍后会进一步使用我的混洗数组。

  public static void shuffle()
{
  int[] a = new int[52];
  int count = 0;
  int random = 0;
  while (count!=51){
    random = (int)(Math.random() * 52);
    for (int i=0; i <=count; i++){
      if (a[count] != b[random])
        result = true;
    }
    if (result){
      a[count] = b[random];
      count++; 
    }
    b = Arrays.copyOf(a, a.length);
  }
}

3 个答案:

答案 0 :(得分:1)

首先,你不应该以这种方式定义shuffle()。我会把b作为参数并将其传递给shuffle()而不是静态字段(因为你的shuffle()被声明为静态,你的b也是静态的吗?在所有实例之间共享b看起来很奇怪)和结果被声明为局部变量。

这部分

for (int i=0; i <=count; i++){
    if (a[count] != b[random])
        result = true;
    }

检查[0],[1]中的任何一个直到[count]不等于b [random]。如果是,则将b [random]分配给[count]并将计数增加1.由于[]未初始化,它只是一个0的数组。(a [count]!= b [random])出现永远是真实的,因此结果是真实的。

然后,对于这部分,

if (result){
    a[count] = b[random];
      count++; 
    }

比如说random = 5,然后在while循环的第一轮a [0] = b [5],count = 1(由于计数++),b变成b [5]和a的数组系列0.(由于

b = Arrays.copyOf(a, a.length);

所有其他元素都替换为0。)

编辑:这里我提供了一个简单的方法,没有经过全面测试,但应该有效:

public static int[] shuffle(int[] array) {
    int[] a = new int[array.length];
    //convert int[] to ArrayList<Integer>
    ArrayList<Integer> list = new ArrayList<>();
    for (int i: array)
        list.add(i);
    //now shuffle:
    for (int i=0; i<array.length; i++) {
        int rand = (int)(Math.random()*list.size());
        a[i] = list.remove(rand);
    }
    return a;
}

返回的数组被洗牌。实际上我不能说方法&#34; shuffles&#34;数组。它只是创建一个空数组,并随机重复选择一个元素并将其放在前面。

Edit2:这真的&#34; shuffles&#34;,这是另一种方法:不返回新数组。它将阵列洗了100次。

public static void shuffle(int[] array) {
    for (int i=0; i<100; i++) {
        int r1 = (int)(Math.random()*array.length);
        int r2 = (int)(Math.random()*array.length);
        int tmp = array[r1];
        array[r1] = array[r2];
        array[r2] = tmp;
    }
}

答案 1 :(得分:0)

import java.util.Random;


public class Shuffle {

    public static void main(String[] args) {
        Integer[] a = new Integer[52];
        for (Integer i=0;i<a.length;i++) a[i] = i+1;
        // Let's shuffle
        Random rd = new Random();
        for (Integer i=0;i<a.length;i++){
            Integer changeBy = rd.nextInt(a.length);
            Integer aux=a[i];
            a[i]=a[changeBy];
            a[changeBy] = aux;
        }
        // Now show the shuffled array
        for (Integer i=0;i < a.length; i++) System.out.print(a[i]+",");

    }

}

希望这个小算法可以帮到你。正如您从2个不同的运行中看到的那样,它确实会改变您的阵列:

11,1,24,13,28,15,25,48,5,22,12,32,29,42,34,7,33,31,47,18,51,40,8,17 ,41,20,6,36,21,45,27,52,38,10,30,14,23,19,43,4,50,46,44,3,49,37,35,2,9 ,26,16,39 3,10,37,26,41,15,28,52,6,24,20,43,33,21,51,32,25,40,50,8,7,5,4,35,13, 16,49,17,29,47,12,14,36,39,45,30,2,42,23,38,31,19,27,46,34,11,18,1,22,48, 9,44

答案 2 :(得分:-1)

为什么没有你HashSet进行洗牌?

java.lang.HashSet中的元素被哈希码混乱。

public static void shuffle()
{
    int [] b; // you origin array
    Set<Integer> temp = new HashSet<Integer>();
    for (int i : b) {
        temp.add(i);
    }
    Integer [] a = new Integer[b.length];
    a = temp.toArray(a); // new shuffle array

}