2013-06-26 2 views
0

В приведенном ниже примере циклы while имитируют механика, видя 10 используемых двигателей. Каждый двигатель имеет 50% -ный шанс работать или не работать. Мой счетчик переменных отслеживает количество рабочих движков и печатает его в конце программы.

Использование random.nextBoolean() - случайный генератор

Вопрос в том, что правильный и наилучший способ использования rgen.nextBoolean()? Лучше ли поместить метод rgen.nextBoolean в метод, а затем вызвать этот метод из цикла while? Кроме того, я немного смущен, как если (rgen.nextBoolean()) знает, что он оценивает n, если вы конкретно не указываете rgen.nextBoolean() в условии if, что вы даете ему значение 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(); 
} 

ответ

3

Кроме того, я немного запутался, как если (rgen.nextBoolean()) знает, что он оценивает n, если вы конкретно не указали rgen.nextBoolean() в условии if, что вы даете ему значение n в качестве значения?

Это не так. Он не мог знать. Так, что происходит?

Генератор случайных чисел имеет внутреннее состояние. Внутреннее состояние находится до тех пор, пока вы не спросите его о новом случайном числе, после чего состояние будет псевдослучайно изменено и будет возвращено новое случайное значение, соответствующее новому состоянию.Поэтому, если вы создаете три генератора случайных чисел с тремя начальными состояниями и запрашиваете их для булевых, они возвращают разные последовательности логических элементов, но если вы генерируете их все с одинаковым стартовым состоянием (например, передавая семя 0 для всех из них, когда построены), они будут производить одну и ту же последовательность навсегда.

Другие мысли:

Почему используют некоторое время п < 10, ++ п цикла, когда это лучше выражено в терминах для цикла?

В чем разница между вызовом nextBoolean и вызовом nextBoolean в методе, если вы не планируете сделать метод подклассом и переопределяемым, например?

1

Мой вопрос заключается в правильно и наилучшим образом использовать rgen.nextBoolean()?

Общий договор nextBoolean заключается в том, что одно логическое значение псевдослучайно генерируется и возвращается. Значения true и false производятся с (приблизительно) равной вероятностью.

Лучше ли вставить rgen.nextBoolean в методе, а затем вызвать метод изнутри цикла while?

Лучшее уважение от чего, правильнее вставить метод, но если у него есть только 2 строки, нет смысла. что вы можете сделать, это while(n++ < 10)

Кроме того, я немного запутался, как если (rgen.nextBoolean()) знает, что это оценка п, если вы специально не сказать rgen.nextBoolean() в в если условие, что вы даете ему значение n в качестве значения?

Вы не даете п, вы можете использовать это еще один метод, nextBoolean (двойной р)

общественного логический nextBoolean (двойной р) Возвращает случайное логическое значение с заданной вероятностью. Этот метод можно использовать для моделирования события , которое происходит с определенной вероятностью. Например, вы могли бы имитировать результат броска монеты следующим образом: String coinFlip = rgen.nextBoolean (0.5)? «ГОЛОВЫ»: «ХВОСТЫ»;

Параметры: р - значение от 0 (невозможно) и 1 (некоторые) с указанием вероятности Возвраты: истинное значение с вероятностью р

+0

спасибо, все еще думая об этом –

+0

о чем? может я не понимаю вас, надеюсь, что это было полезно – nachokk

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.