8.7 随机数

大多数计算机程序每次运行时所做的事情相同,这样的程序是确定的(deterministic)。确定性是件好事,因为我们希望同样的计算得到同样的结果。但对有些应用程序来说,我们希望它们的行为是不可预测的,游戏就是一个显而易见的例子,当然还有很多其他的例子。

实际上,很难让程序的行为是不确定的(nondeterministic),因为要让计算机生成真正的随机数很难。但存在一些算法,可用于生成被称为伪随机数(pseudorandom number)的不可预测序列。对大多数应用程序来说,伪随机数的随机程度已经足够高了。

如果你完成了练习 3-4,就会知道 java.util.Random 生成的就是伪随机数。这个类的方法 nextInt 接受 int 实参 n,并返回一个位于 0~n-1(闭区间)的随机数。

如果你生成大量的随机数,每个值出现的次数将大致相同。要验证 nextInt 的这种行为,可以用它生成大量的随机数,然后将这些随机数存储在一个数组中,并计算每个值出现的次数。

下面的方法创建了一个 int 数组,并用 0~99 的随机数来填充它。数组的长度由传递的实参指定,且返回值是一个引用,指向新创建的数组。

  1. public static int[] randomArray(int size) {
  2. Random random = new Random();
  3. int[] a = new int[size];
  4. for (int i = 0; i < a.length; i++) {
  5. a[i] = random.nextInt(100);
  6. }
  7. return a;
  8. }

下面的代码片段创建了一个数组,并用 8.3 节的方法 printArray 显示这个数组:

  1. int numValues = 8;
  2. int[] array = randomArray(numValues);
  3. printArray(array);

输出类似于以下这样:

  1. {15, 62, 46, 74, 67, 52, 51, 10}

运行这些代码生成的随机数可能与这里显示的不同。