在下面的示例中,while循环模拟了一个机械师,查看了10个二手发动机。每个引擎有50%的机会运转或不运转。我的变量计数器跟踪工作中的引擎数量,并在程序结束时将其打印出来。

我的问题是这是使用rgen.nextBoolean()的正确和最佳方法吗?最好将rgen.nextBoolean放入方法中,然后从while循环内部调用该方法?另外,我有点困惑,如果您不特别告诉rgen.nextBoolean()在if条件下将n作为值给出的话,if(rgen.nextBoolean())如何知道它正在评估n?

import acm.program.*;
import acm.util.*;

public class WorkingEngines extends ConsoleProgram{
public void run(){


int n = 0;
int counter = 0;

    while (n < 10) {
     if (rgen.nextBoolean()){
       counter++;
          }
      n++;
      }
 println("out of ten random engines you have" + counter + " working properly");
 }




private RandomGenerator rgen = RandomGenerator.getInstance();
}

最佳答案

另外,我有点困惑,如果您不特别告诉rgen.nextBoolean()在if条件下将n作为值的话,if(rgen.nextBoolean())如何知道它正在评估n?


不是。它不可能知道。那么发生了什么?

随机数生成器具有内部状态。内部状态一直存在,直到您要求它提供新的随机数为止,随后状态被伪随机更改,并返回与新状态相对应的新随机值。因此,如果您生成具有三个起始状态的三个随机数生成器并要求它们提供布尔值,则它们将返回不同的布尔值序列,但是如果您以相同的起始状态生成它们的所有布尔值(例如,当它们都以0的形式传递给它们时,他们将永远产生相同的序列。

其他想法:

为什么用for循环更好地表达while n
例如,除非计划将方法设为子类且可重写,否则在方法中调用nextBoolean和调用nextBoolean有什么区别?

08-04 20:02