在下面的示例中,while循环模拟了一个看到10个引擎的机制。每台发动机有50%的工作机会或不工作。我的变量计数器记录工作引擎的数量,并在程序结束时将其打印出来。
我的问题是这是使用rgen.nextBoolean()的正确和最好的方法吗?将rgen.nextBoolean放在方法中然后从while循环中调用该方法会更好吗?另外,我有点困惑如果(rgen.nextBoolean())知道它正在评估n如果你没有在if条件中明确地告诉rgen.nextBoolean()你将它作为值给出?
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();
}
答案 0 :(得分:3)
另外,我有点困惑如果(rgen.nextBoolean())知道它正在评估n如果你没有在if条件中特别告诉rgen.nextBoolean()你给它n作为值?
不是。它不可能知道。那么,是怎么回事?
随机数生成器具有内部状态。内部状态一直存在,直到你向它询问一个新的随机数,然后伪随机改变状态并返回一个对应于新状态的新随机值。因此,如果您生成三个具有三个起始状态的随机数生成器并且询问它们是否为布尔值,则它们将返回不同的布尔序列,但是如果您生成它们都具有相同的起始状态(例如通过将0的种子传递给所有它们他们将永远产生相同的序列。
其他想法:
为什么要使用一段时间n&lt; 10,++ n循环,当用for循环更好地表达时?
调用nextBoolean和在方法中调用nextBoolean有什么区别,除非你打算让方法子类化和覆盖,例如?
答案 1 :(得分:1)
我的问题是这是使用正确和最好的方法 rgen.nextBoolean()?
nextBoolean的一般契约是伪随机生成并返回一个布尔值。值true和false以(近似)相等的概率产生。
将rgen.nextBoolean放在方法中然后调用它会更好吗? while循环内部的方法?
更好地尊重什么,放入一个方法更正确,但如果它只有2行没有意义。你可以做的是while(n++ < 10)
另外,如果(rgen.nextBoolean())知道它,我有点困惑 如果你没有特别告诉rgen.nextBoolean(),请评估n 你给它n作为值的if条件?
你不给n,你可以用另一种方法, nextBoolean(double p)
public boolean nextBoolean(double p)返回随机布尔值 具有指定的概率。您可以使用此方法来模拟 以特定概率发生的事件。例如,你 可以模拟抛出这样的硬币的结果:字符串 coinFlip = rgen.nextBoolean(0.5)? “HEADS”:“TAILS”;
参数:p - 0(不可能)和1(某些)之间的值 指示概率返回:值为true,概率为p
答案 2 :(得分:1)
您没有指定调用rgen.nextBoolean()时的概率。
您需要更改一行:
if (rgen.nextBoolean()){
为:
if (rgen.nextBoolean(0.5)){//The "0.5" in the brackets will set the probability to 50%
如果这不起作用,我会尝试:
public void run(){
int n = 0;
int counter = 0;
int coinToss;
while (n < 10) {
coinToss = rgen.nextBoolean( 0.5 );
if (rgen.nextBoolean()){
counter++;
}
n++;
}
println("out of ten random engines you have" + counter + " working properly");
}
祝你好运!
另外,请参阅RandomGenerator上的文档。