5. 随机数使用技巧¶
5.1. 生成随机数¶
有时候你可能发现,在你的一些程序中做随机选择会有所帮助,因为你希望你的选择更加独立和多样化。Java 提供了一个名为 Random 的内置类来生成随机数,我们的 student 类库包含这个类的一个特殊版本,对初学者很有帮助。要使用这个类,请在文件顶部添加以下 import 语句:
import student.util.Random;
Random 类提供了一个名为 generator() 的方法来获取一个表示随机数生成器的对象。在这里,我们只需要处理生成随机整数,generator 为此提供了一个非常有用的方法。你可以这样使用它:
Random generator = Random.generator(); // local variable to refer to the random number generator
int value = generator.nextInt(4); // generate a random number from 0 - 3
generator 提供了一个名为 nextInt() 的方法来生成随机整数。它接受一个参数,即上限。当你提供这个上限时, nextInt() 方法会生成一个从 0(含)到上限(不含)的数字。
所以,例如,如果你想生成一个 0-99 之间的数字,你会调用 nextInt(100) 。假设你想在 15% 的时间里执行某个动作。你可以这样做:
Random generator = Random.generator(); // local variable to refer to the random number generator
int value = generator.nextInt(100);
if (value < 15)
{
// ...
}
在这里,调用 nextInt() 将产生一个 0-99 之间的数字(也就是 100 个可能值),如果生成的数字在 0-14 范围内(即 15 个可能值,或 15% 的时间),if 语句将执行它的 true 分支。
5.2. 测试随机行为¶
随机行为非常适合基于机会的事件。但随机行为也使软件测试变得困难。当你在代码中添加随机行为然后想测试它时,你的测试用例会做什么呢?假设你想让你的 Actor 在特定情况下有一半时间左转,另一半时间右转。如果你编写一个 Actor 处于那种情况的测试用例,它可能会左转……也可能不会。你怎么可能为此编写测试???
答案很简单: Random 类能帮助你。考虑下面的代码序列,它生成三个小于 100 的随机数:
// using the same local variable "generator" from before
int x = generator.nextInt(100);
int y = generator.nextInt(100);
int z = generator.nextInt(100);
编写使用这段代码的测试用例会很困难,因为你无法控制 x、y 和 z 最终会得到什么值。不过,对于测试用例, Random 类提供了一个名为 setNextInts() 的特殊方法,让你可以为测试目的控制生成哪些数字。你可以这样使用它:
// In your test case, do this:
Random.setNextInts(40, 50, 60);
// In the code you are testing, this happens:
int x = generator.nextInt(100);
int y = generator.nextInt(100);
int z = generator.nextInt(100);
// You know x will get the value 40, while y is 50, and z is 60
所以,当你测试随机行为时,你可以在你的测试用例中说明你希望随机数生成器产生的值序列,从而强制这些动作变得可预测。在测试用例之外,生成器会产生真正(伪)随机的序列,但在你的测试用例内部,这些数字将完全由你决定。
