从两个数字中随机选择一个数字

Bas*_*ngh 8 java random

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

int a = 35:
int b = 70;
Run Code Online (Sandbox Code Playgroud)

我想在运行时随机选择其中一个并分配给另一个变量.即

int c = a or b:
Run Code Online (Sandbox Code Playgroud)

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

或者随机化布尔值并在if-else中使用它.

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

And*_*sen 9

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

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

int a = 35;
int b = 70;
int c = random.nextBoolean() ? a : b;
Run Code Online (Sandbox Code Playgroud)

在哪里random是一个实例java.util.Random.您可以将此实例存储为final static类中的字段以重复使用它.

如果您不需要真正的随机性,但只想在给定代码块的每次调用中在两个数字之间切换,那么您只需存储boolean并切换它即可:

...
int c = toggle ? a : b;
toggle = !toggle;
Run Code Online (Sandbox Code Playgroud)

由于我无法评论其他答案,我想指出一些其他答案的问题,这些答案建议在更大范围内生成随机整数,并根据结果是奇数还是偶数做出决定,或者如果它低于或大于中间值.这实际上与生成0和1之间的随机整数完全相同,除了过于复杂.该nextInt(n)方法在-2 ^ 31和(2 ^ 31)-1之间的随机生成的整数上使用模运算符,这基本上就是你最终将要做的事情,只是用n = 2.

如果您使用标准库方法Collections.shuffle(),那么您将再次过度复杂化,因为标准库使用标准库的随机数生成器.

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


Bab*_*aby 5

另一种方法是将数字存储到列表中,随机播放,然后取第一个元素.

ArrayList<Integer> numbers=new ArrayList<Integer>();
numbers.add(35);
numbers.add(70);
Collections.shuffle(numbers);

numbers.get(0);
Run Code Online (Sandbox Code Playgroud)