【问题标题】:Randomly "shaking" an array to assign new random spots随机“摇动”一个数组以分配新的随机点
【发布时间】:2013-09-30 06:07:42
【问题描述】:

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

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);

【问题讨论】:

  • 您能否发布输入示例以及它提供的输出。最好多试几次
  • 如何实例化Coin.RANDOM
  • 即使按照您想要的方式工作,它不只是与前 11 个项目一起洗牌吗?应该是 .nextInt(coins.length) 吗?
  • @Marcus 编辑您的帖子。不要在 cmets 中发帖。
  • 谢谢乔,我解决了这个问题,Prateek 我认为这无关紧要。 @YasmaniLlanes 添加了 coin.random 实例化。

标签: java arrays random


【解决方案1】:

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

Collections.shuffle(arrayList);

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以使用 Knuth 的 shuffle 算法重新排列数组,以便结果是均匀随机排列。算法很简单,但效果很好:

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

      请注意,在您的实现中,随机数是在 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, 
      

      【讨论】:

      • 我不知道为什么这会有所作为。但是我只是将我的打印语句移到了一个单独的循环中。它现在应该像现在一样工作......我也把 i+1 放在那里。
      【解决方案4】:

      当您使用交换作为索引时,您将使用它交换当前值,您可以编辑随机数生成器以生成特定范围之间的随机数(例如 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 之间生成交换(索引)并继续此操作直到您完全耗尽阵列。这可确保您不会在索引处交换已显示的值。但我并不完全相信这确实是一个随机洗牌,因为在循环开始时,您对交换索引有更多选择,然后在循环中稍后的某个时间您会有更多选择,并且摇动不是完全随机的。此解决方案仅适用于您想严格实施自己的摇动方法而不使用@Tomek 提到的Collections.shuffle

      【讨论】:

      • collections.shuffle 的问题是我以前从未使用过它。我也从未见过。当我尝试添加 i+1 - coin.length 时。我得到一个例外,说 n 必须是正数??
      • 我的意思是 i+1coins.length 不减去两者:)
      • 哦,我的错,这就是它在我的屏幕上显示下一行的方式。哈哈。但是是的,它现在可以工作了。非常感谢!!
      • 很高兴我能帮上忙!!如果您认为答案对您有帮助,请随时投票。
      • 如果我有足够的声望我会哈哈,我还需要 5 次才能做到这一点。对不起!!
      【解决方案5】:

      请注意这一行

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

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

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

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

      【讨论】:

      • 好吧,我换了我的来表示,现在唯一的问题是我有复制自己的硬币。
      • 如果你有一个数组,你只需要再输入几个字符:Collections.shuffle(Arrays.asList(coins))
      • 好吧,我仍然不能使用我不相信的。我很确定我必须创建自己的摇动方法。
      • 即使您实现了自己的摇动方法,我强烈建议您尝试Collection.shuffle 并了解如何将其合并为您的使用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      • 2019-03-19
      相关资源
      最近更新 更多