我有两个整数,让它们成为

int a = 35:
int b = 70;

我想在运行时随机选择其中一个并分配给另一个变量。 IE。
int c = a or b:

我想到的一种方法是用这两个整数创建一个数组,并找到一个介于0和1之间的随机整数,并将其用作获取该数字的数组索引。

或将 boolean 值随机化,并在if-else中使用它。

我的问题是,有没有更好,更有效的方法来实现这一目标? IE。从两个预先定义的整数中选择一个数字?

最佳答案

您是否有特定原因要求更有效的解决方案?除非此功能位于某个地方非常紧密的内部循环中(例如在光线跟踪器中),否则您可能会试图过早地优化代码。

如果您想避免使用数组,并且不喜欢if语句的“膨胀”,则可以使用三元选择运算符在两者之间进行选择:

int a = 35;
int b = 70;
int c = random.nextBoolean() ? a : b;

其中randomjava.util.Random的实例。您可以将该实例存储为类中的final static字段以重用它。

如果您不需要真正的随机性,而只想在给定代码块的每次调用中在两个数字之间切换,则只需存储一个boolean并切换它即可:
...
int c = toggle ? a : b;
toggle = !toggle;

由于我无法评论其他答案,因此我想指出一些其他答案的问题,这些答案建议生成更大范围内的随机整数,并根据结果是奇数还是偶数来做出决定,或者如果它小于或大于中间值。实际上,这与生成0到1之间的随机整数完全相同,只是过于复杂。 nextInt(n)方法uses the modulo operator在-2 ^ 31和(2 ^ 31)-1之间随机生成的整数上,这实际上是您最终将要执行的操作,仅使用n = 2即可。

如果您使用的是Collections.shuffle()之类的标准库方法,那么您将再次变得过于复杂,因为标准库使用标准库的随机数生成器。

请注意,到目前为止,所有建议都不如我的简单nextBoolean()建议有效,因为它们需要不必要的方法调用和算术。

10-07 19:33
查看更多