【发布时间】:2017-07-31 04:03:56
【问题描述】:
我正在与一台计算机进行单人井字游戏,我想知道如何在一个数组中选择一个随机布尔值,该值是假的,其中一些值为真,一些值为假。我知道使用 Math.random() 但我想知道如果所选元素为真而不是假,我将如何选择不同的随机元素?或者如果有人知道更好的方法而不是使用 Math.random()。
【问题讨论】:
标签: java arrays random boolean
我正在与一台计算机进行单人井字游戏,我想知道如何在一个数组中选择一个随机布尔值,该值是假的,其中一些值为真,一些值为假。我知道使用 Math.random() 但我想知道如果所选元素为真而不是假,我将如何选择不同的随机元素?或者如果有人知道更好的方法而不是使用 Math.random()。
【问题讨论】:
标签: java arrays random boolean
在不改变代码结构的情况下,一种可能的方法是收集数组中所有错误值的索引,然后随机选择其中一个索引。
类似这样的:
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]);
【讨论】:
我已经为一个不错的 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]
【讨论】:
false 元素或数组很大时,这将无限循环。
i = (int)(Math.random() * size); 应改为i = new Random().nextInt(size);
您有一个布尔值数组,我假设索引代表您游戏中的某些内容。如果您需要从数组中随机检索一个布尔值(我假设您的意思是您想要布尔值的索引),那么使用Math.random() 并继续挑选直到您得到一个错误值会变得低效。相反,请考虑重新设计您的问题,使其具有 2 个整数数组,一个代表真值,一个代表假值。与其在索引 3 处设置布尔值 false,不如将 int 3 存储在 false 数组中。一旦像这样重新设计,要访问一个随机的错误元素,您只需在您的错误整数数组上使用一次Math.random()。
或者,您可以只使用一个额外的 int 数组来仅跟踪错误值的索引,您可以使用 Math.random() 对其进行索引以获得随机错误值。
【讨论】: