我需要一个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);
}
}
答案 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
}