我有两个整数,让它们成为
int a = 35:
int b = 70;
我想在运行时随机选择其中一个并分配给另一个变量。即。
int c = a or b:
我想到的一种方法是创建一个包含这两个整数的数组,并找到一个介于0和1之间的随机整数,并将其用作数组的索引来获取数字。
或随机化布尔值并在if-else中使用它。
我的问题是,是否有更好,更有效的方法来实现这一目标?即从两个先前定义的整数中选择一个数字?
答案 0 :(得分:8)
您是否有特殊原因要求更有效的解决方案?除非此功能位于某个非常紧密的内部循环中(例如在光线跟踪器中),否则您可能会尝试过早优化代码。
如果你想避开阵列,如果你不喜欢"膨胀"对于if语句,您可以使用三元选择运算符在两者之间进行选择:
int a = 35;
int b = 70;
int c = random.nextBoolean() ? a : b;
其中random
是java.util.Random
的实例。您可以将此实例存储为类中的final static
字段以重复使用它。
如果您不需要真正的随机性,但只想在给定代码块的每次调用中在两个数字之间切换,您只需存储boolean
并切换它即可:
...
int c = toggle ? a : b;
toggle = !toggle;
由于我无法评论其他答案,我想指出一些其他答案的问题,这些答案建议在更大范围内生成随机整数并根据是否进行决策结果是奇数或偶数,或者它是否低于或大于中间值。这实际上与生成0和1之间的随机整数完全相同,除了过于复杂。关于-2 ^ 31和(2 ^ 31)-1之间随机生成的整数的nextInt(n)
方法uses the modulo operator,这基本上就是你最后要做的事情,只需{{1} }。
如果您使用的是n = 2
等标准库方法,那么您将再次过度复杂化,因为标准库使用标准库的随机数生成器。
请注意,所有建议(到目前为止) 效率低于我的简单Collections.shuffle()
建议,因为它们需要不必要的方法调用和算术。
答案 1 :(得分:5)
另一种方法是将数字存储到列表中,随机播放,然后取出第一个元素。
ArrayList<Integer> numbers=new ArrayList<Integer>();
numbers.add(35);
numbers.add(70);
Collections.shuffle(numbers);
numbers.get(0);
答案 2 :(得分:1)
在我看来,这里的主要问题是两个数字的熵,而不是利用那个熵。索引数组或布尔值基本相同。你还能做什么(希望它会更随机)是让Java给你一个0到100之间的随机数。现在,如果选择的随机数是奇数,你选择int c = a
。另外选择b
。我可能错了,但是在0到100之间随机选择似乎比在两个数字之间随机选择更随机。
答案 3 :(得分:1)
您可以简单地使用安全随机生成器(java.security.SecureRandom
)。
try {
r = SecureRandom.getInstance("SHA1PRNG");
boolean b1 = r.nextBoolean();
if (b1) {
c = a;
} else {
c = b;
}
} catch (NoSuchAlgorithmException nsae) {
// Process the exception in some way or the other
}
请参阅此链接以获取更多information
答案 4 :(得分:0)
随机化一个介于1和10之间的整数,如果它大于5,则取b的另一个值。据我所知,没有其他方法可以从整数中进行选择。
答案 5 :(得分:0)
int a=1;
int b=2;
int get = new Random().nextBoolean()? a : b;