【问题标题】:Selecting a random element in boolean array in java在java中的布尔数组中选择一个随机元素
【发布时间】:2017-07-31 04:03:56
【问题描述】:

我正在与一台计算机进行单人井字游戏,我想知道如何在一个数组中选择一个随机布尔值,该值是假的,其中一些值为真,一些值为假。我知道使用 Math.random() 但我想知道如果所选元素为真而不是假,我将如何选择不同的随机元素?或者如果有人知道更好的方法而不是使用 Math.random()。

【问题讨论】:

    标签: java arrays random boolean


    【解决方案1】:

    在不改变代码结构的情况下,一种可能的方法是收集数组中所有错误值的索引,然后随机选择其中一个索引。

    类似这样的:

    Random r = new Random();
    boolean[] values = { true, false, false, true, false, true, false, false, false };
    
    int[] falseIndices = IntStream.range(0, values.length)
      .filter(i -> !values[i])
      .toArray();
    System.out.println(Arrays.toString(falseIndices));
    int randomFalseIndex = falseIndices[r.nextInt(falseIndices.length)];
    System.out.format("%s: %s%n", randomFalseIndex, values[randomFalseIndex]);
    

    【讨论】:

      【解决方案2】:

      我已经为一个不错的 tictactoe 实现实现了一个小的 sn-p,请忽略我之前的实现,因为它非常有问题。在这里您可以设置起点并通过适当的枚举,您可以更正确地跟随董事会。这个答案更像 Java 的 IMO;

      public static void main(String[] args) throws Exception {
          Boolean aiStarts = true;
          Integer size = 9, step = 0;
          List<Spot> board = new ArrayList<>(Collections.nCopies(size, Spot.E));
      
          do {
              int i;
              do {
                  i = (int)(Math.random() * size);
              } while (!Spot.E.equals(board.get(i)));
              board.set(i, step++ % 2 == (aiStarts ? 0 : 1) ? Spot.X : Spot.O);
          } while (board.stream().filter(s -> Spot.E.equals(s)).count() > 0);
      
          System.out.println(board.subList(0, 3));
          System.out.println(board.subList(3, 6));
          System.out.println(board.subList(6, 9));
      }
      
      enum Spot {
          X, O, E;
      }
      

      如果 AI 使用 X 而用户使用 `O',您可以将自动插入逻辑替换为用户的输入。例如,这会打印出来;

      [O, X, O]
      [X, X, X]
      [O, X, O]
      

      【讨论】:

      • 这或多或少是我所做的。 What I did was use an array of JButtons and for every JButton gave it an index, and when that button was selected it would select that index in the boolean array and would change it to true (all elements in that array were initially set to false )。这个布尔数组是我用来为计算机选择元素的。所以可用的单元格会是假的,而已经选择的单元格会是真的。我不确定这是否是解决此问题的正确/有效方法,但到目前为止它有效。
      • 当没有false 元素或数组很大时,这将无限循环。
      • @MaxZoom 感谢您的评论,我知道效率低下,但无限循环是可耻的,我用更适合 Java 的答案更新了答案。 @here_I_am,请查看更新后的答案!
      • i = (int)(Math.random() * size); 应改为i = new Random().nextInt(size);
      【解决方案3】:

      您有一个布尔值数组,我假设索引代表您游戏中的某些内容。如果您需要从数组中随机检索一个布尔值(我假设您的意思是您想要布尔值的索引),那么使用Math.random() 并继续挑选直到您得到一个错误值会变得低效。相反,请考虑重新设计您的问题,使其具有 2 个整数数组,一个代表真值,一个代表假值。与其在索引 3 处设置布尔值 false,不如将 int 3 存储在 false 数组中。一旦像这样重新设计,要访问一个随机的错误元素,您只需在您的错误整数数组上使用一次Math.random()

      或者,您可以只使用一个额外的 int 数组来仅跟踪错误值的索引,您可以使用 Math.random() 对其进行索引以获得随机错误值。

      【讨论】:

        【解决方案4】:

        我觉得你可以试试代码,结果是随机的

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-23
          • 1970-01-01
          • 1970-01-01
          • 2017-05-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多