2

我想做的是拿我的数组硬币[]。并且基本上将每个硬币重新排列到不同的位置。这就是我到目前为止所拥有的。但是,当我这样做时,什么也没有发生。意味着所有值都保持不变。除了最后一个。那一个改变。

public void shake() 
{
    for (int i = 0; i < coins.length; i++)
    {
        int index = Coin.RANDOM.nextInt(coins.length);
        Coin temp = coins[index];
        coins[index] = coins[i];
        coins[i] = temp;

        System.out.print(coins[i] + ", ");
    }
}

我像这样实例化随机:

public static long SEED = System.currentTimeMillis();
public static Random RANDOM = new Random(SEED);
4

5 回答 5

2

请注意这条线

System.out.print(coins[swap] + ", ");

显示已经移动(交换)的硬币。也许您正在考虑在索引处显示新硬币:(无论如何这都不正确,因为已经显示的硬币仍然可以在下一次迭代中交换)。可能最好创建第二个循环来显示最终硬币值。icoins[i]for

但这不仅仅是这里的问题。要随机打乱数组,您应该使用与您的方法略有不同的Fisher-Yates算法。您可以在SO上找到该算法的 Java 实现。

如果你有一个List<Coin>而不是Coin[](列表而不是数组),你可以使用该Collections.shuffle方法并确保算法是正确的,你总是会得到随机结果。

于 2013-09-24T20:49:46.597 回答
1

当您使用交换作为索引时,您将交换当前值,您可以编辑随机数生成器以生成特定范围(例如0 - coins.length)之间的随机数,然后您可以将实现更改为类似这样

public void shake() 
{

    Coin temp;

    for (int i = 0; i < coins.length; i++)
    {
        //int swap = Coin.RANDOM.nextInt(coins.length);
        temp = coins[swap];
        coins[swap] = coins[i];
        coins[i] = temp;

        System.out.print(coins[i] + ", ");
    }
}

对于代码中的注释行,请检查THIS以更新您的随机数生成器以生成两个值之间的数字。然后每次在i+1-之间生成交换(索引)coins.length并继续此操作,直到您完全耗尽阵列。这可确保您不会在索引处交换已显示的值。但我并不完全相信这确实是一个随机洗牌,因为在循环开始时,您对交换索引有更多选择,然后在循环中稍后的某个时间您会有更多选择,并且摇动不是完全随机的。此解决方案仅适用于您想要严格实现自己的摇动方法而不使用Collections.shuffle@Tomek 提到的。

于 2013-09-24T21:09:34.293 回答
1

你为什么不使用集合?为数组或 ArrayList 中的每个值分配随机索引非常简单。

Collections.shuffle(coins);//if coins is array
Collections.shuffle(Arrays.asList(coins));//if coins is an ArrayList
于 2017-09-27T19:08:04.120 回答
0

您可以使用 Knuth 的改组算法重新排列数组,以便结果是均匀随机排列。算法很简单,但就像一个魅力:

  1. 遍历数组并在迭代中选择0i之间的随机整数交换
  2. 交换数组[i]数组[交换]

请注意,在您的实现中,随机数在 0 到 11 之间生成,这似乎不会产生良好的改组。

这是一个对整数数组进行改组的代码示例:

import java.util.Random;

public class Test {

public static long SEED = System.currentTimeMillis();
public static Random RANDOM = new Random(SEED);

public static void shuffle(int[] numbers)
{
    for (int i = 0; i < numbers.length; i++)
    {
        int swap = RANDOM.nextInt(i + 1);
        int temp = numbers[swap];
        numbers[swap] = numbers[i];
        numbers[i] = temp;
    }

    for (int i = 0; i < numbers.length; i++) {
        System.out.print(numbers[i] + ", ");
    }
}

public static void main(String[] args) {
    shuffle(new int[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11});
}

}

测试运行的输出是:

5, 11, 6, 1, 3, 10, 9, 2, 4, 7, 8, 
于 2013-09-24T21:13:03.507 回答
0

使用此方法并在参数中传递您的数组

Collections.shuffle(arrayList);

这个方法返回 void 所以它不会给你一个新的列表,但是我们知道数组在 Java 中是作为引用类型传递的,所以它会打乱你的数组并在其中保存打乱的值。这就是为什么你不需要任何返回类型。

您现在可以使用洗牌的arraylist。

来源:https ://stackoverflow.com/a/16112539/4291272

于 2019-12-12T10:15:20.493 回答