Java 随机地;摇动;分配新随机点的数组

Java 随机地;摇动;分配新随机点的数组,java,arrays,random,Java,Arrays,Random,我想做的是拿走我的阵列硬币[]。基本上把每枚硬币重新排列到不同的位置。这就是我目前所拥有的。当我这么做的时候,什么也没发生。这意味着所有的值都保持不变。除了最后一个。那一个变了 public void shake() { for (int i = 0; i < coins.length; i++) { int index = Coin.RANDOM.nextInt(coins.length); Coin temp = coins[index

我想做的是拿走我的阵列硬币[]。基本上把每枚硬币重新排列到不同的位置。这就是我目前所拥有的。当我这么做的时候,什么也没发生。这意味着所有的值都保持不变。除了最后一个。那一个变了

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] + ", ");
    }
}

请注意这一行

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

但这不是这里唯一的问题。要随机洗牌数组,您应该使用与您的方法稍有不同的算法。您可以在上找到该算法的Java实现


如果您使用的是
列表
而不是
硬币[]
(列表而不是数组),则可以使用该方法,并确保算法正确,并且始终会得到随机结果。

请注意,这一行

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

但这不是这里唯一的问题。要随机洗牌数组,您应该使用与您的方法稍有不同的算法。您可以在上找到该算法的Java实现


如果您有一个
列表
而不是
硬币[]
(列表而不是数组)您可以使用该方法,并确保算法正确,并且始终会得到随机结果。

当您使用交换作为索引来交换当前值时,您可以编辑随机数生成器以生成特定范围内的随机数(例如
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] + ", ");
    }
}
public void shake()
{
硬币温度;
for(int i=0;i

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

使用swap作为交换当前值的索引时,您可以编辑随机数生成器以在特定范围内生成随机数(比如说
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] + ", ");
    }
}
public void shake()
{
硬币温度;
for(int i=0;i

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

您可以使用Knuth的shuffling算法,该算法重新排列数组,以使结果不受影响形式随机排列。算法很简单,但工作起来很有魅力:

  • 在数组上迭代,并在迭代i中选择0i之间的随机整数swap
  • 交换数组[i]数组[Swap]
  • 请注意,在您的实现中,random是在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});
    }
    

    您可以使用Knuth的洗牌算法,该算法重新排列数组,以使结果为一致随机排列。该算法简单,但效果很好:

  • 在数组上迭代,并在迭代i中选择0i之间的随机整数swap
  • 交换数组[i]数组[Swap]
  • 请注意,在您的实现中,random是在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});
    }
    

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

    Collections.shuffle(coins);//if coins is array
    Collections.shuffle(Arrays.asList(coins));//if coins is an ArrayList
    

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

    Collections.shuffle(coins);//if coins is array
    Collections.shuffle(Arrays.asList(coins));//if coins is an ArrayList
    
    <