0

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

我的问题是这是使用 rgen.nextBoolean() 的正确和最佳方法吗?将 rgen.nextBoolean 放入方法中然后从 while 循环内部调用该方法会更好吗?另外,我有点困惑 if(rgen.nextBoolean()) 如果你没有在 if 条件下明确告诉 rgen.nextBoolean() 你给它 n 作为一个值,它是如何知道它正在评估 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();
}
4

3 回答 3

3

另外,我有点困惑 if(rgen.nextBoolean()) 如果你没有在 if 条件下明确告诉 rgen.nextBoolean() 你给它 n 作为一个值,它是如何知道它正在评估 n 的?

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

随机数生成器具有内部状态。内部状态一直存在,直到您要求它提供一个新的随机数,然后状态被伪随机更改并返回与新状态相对应的新随机值。因此,如果您生成三个具有三个起始状态的随机数生成器并向它们询问布尔值,它们将返回不同的布尔值序列,但是如果您生成它们都具有相同的起始状态(例如通过将种子 0 传递给所有它们时构造)它们都将永远产生相同的序列。

其他想法:

当用 for 循环更好地表达时,为什么要使用 while n < 10, ++n 循环?

调用 nextBoolean 和在方法中调用 nextBoolean 有什么区别,除非您计划使方法成为子类和可覆盖,例如?

于 2013-06-26T01:16:13.243 回答
1

我的问题是这是使用 rgen.nextBoolean() 的正确和最佳方法吗?

nextBoolean 的一般约定是伪随机生成并返回一个布尔值。值 true 和 false 以(大约)相等的概率产生。

将 rgen.nextBoolean 放入方法中然后从 while 循环内部调用该方法会更好吗?

更好地尊重什么,放入一个方法更正确,但如果它只有 2 行没有意义。你能做的是while(n++ < 10)

另外,我有点困惑 if(rgen.nextBoolean()) 如果你没有在 if 条件下明确告诉 rgen.nextBoolean() 你给它 n 作为一个值,它是如何知道它正在评估 n 的?

您没有给出 n,您可以使用另一种方法,nextBoolean(double p)

public boolean nextBoolean(double p) 返回具有指定概率的随机布尔值。您可以使用此方法来模拟以特定概率发生的事件。例如,您可以像这样模拟掷硬币的结果: String coinFlip = rgen.nextBoolean(0.5) ? “头”:“尾”;

参数: p - 介于 0(不可能)和 1(确定)之间的值,表示概率 返回:具有概率 p 的值 true

于 2013-06-26T00:45:36.730 回答
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的文档。

于 2013-06-26T02:25:46.137 回答