Домашняя работа: функция для возврата одного из двух значений при каждом вызове - PullRequest
8 голосов
/ 14 мая 2011

Я пытаюсь написать функцию, которая будет возвращать true или false при каждом вызове, но с известной частотой, скажем, 60% времени это будет верно, остальные 40% будут ложными. Используя эту функцию, я создаю другую функцию, которая возвращает истинное значение в 50% случаев.

Мой первоначальный подход состоял в том, чтобы использовать случайную функцию и возвращать истину, если ее значение меньше 0,6, ложь, если она закончена. Не уверен, как подходить ко второй части, используя это.

Ответы [ 4 ]

12 голосов
/ 14 мая 2011

Давайте рассмотрим общий случай: вы создали функцию F1 (), которая возвращает True с вероятностью P (в вашем случае P = 60%).теперь вы строите вторую функцию следующим образом:

F2():
   result1 = F1()
   result2 = F1()
   if result1 = True and result2 = False: return True
   elif result1 = False and result2 = True: return False
   else:  F2()

В этом случае вероятность запуска F1 дважды и получения (True, False) такая же, как получение (False, True) и ее P * (1-Р).Вместо этого, если вы получаете (True, True) или (False, False), вы вызываете F2 рекурсивно.Это означает, что после запуска F2 вы всегда получаете True или False с вероятностью 1/2, поскольку первые две ветви имеют равные вероятности, а третья всегда даст вам результат функции с вероятностью 1/2.

Я делаю это вики-сообществом на случай, если кто-то захочет прояснить мой ответ.Я понимаю, что это может быть немного трудно объяснить концепцию.

Среднее количество вызовов

Вероятность того, что функция F2 () завершается сразу после n рекурсивных вызововis:

{(1-P) ^ 2 + P ^ 2} ^ n * 2P (1-P)

Следовательно, среднее число рекурсивных вызововтребуется:

\ Sum_ {i = 0} ^ \ infty i * {(1-P) ^ 2 + P ^ 2} ^ i * 2P (1-P)

0 голосов
/ 12 сентября 2011

эй, как насчет этого подхода: Мы знаем, что вызов F1 () 10 раз: 6 раз он вернет true и 4 раза false

Таким образом, в F2 () у нас может быть счетчик, который считает до 5. При каждом вызове F1 () мы увеличиваем счетчик. F2 () возвращает то, что F1 () возвращает. Когда счетчик достигает 5, F2 () возвращает «false» и повторно инициализирует счетчик. Что сказать?

0 голосов
/ 14 мая 2011

Подход:

Вы запускаете свою функцию 40/60, пока не нажмете результат, который возвращает вероятность 40%. Как только это произойдет, вы рассчитываете результат.

0,5 рассчитывается таким образом.

0,5 = 0,6 - 0,6 ^ 2 + 0,6 ^ 3 + 0,6 ^ 4 - 0,6 ^ 5 - 0,6 ^ 6 + 0,6 ^ 7 + 0,6 ^ 8 - 0,6 ^ 9 + ....
(если текущий результат больше 0,5, вы добавляете, а затем вычитаете)

Как только вы нажмете 0,4, вы рассчитываете результат этой функции. Если это> 0,5, вы возвращаете true, иначе вы возвращаете false.

0 голосов
/ 14 мая 2011

Хорошо, у нас есть функция, которая генерирует значение True с p = 0,60 и значение False с p = 0,40.Предположим, на секунду мы запустили эту функцию дважды?Какова вероятность того, что результаты будут одинаковыми.

, поэтому F_1 == true и F_2 == true происходит с p (0.60 * 0.60) = 0.36

и F_1 == false иF_2 == ложное происходит с p (0,40 * 0,40) = 0,16

и F_1! = F_2 происходит с p (0,6 * 0,4 + 0,6 * 0,4) = 0,48

, что даст вамфункция с возвратом истины 0,52 процента времени, что не совсем то, что мы ищем, но интересно.

Гораздо более простым решением было бы сказать: если у меня истина 60% времени, тогдав какой процент времени (какая вероятность) я должен изменить это значение на ложное, чтобы оно было истинным в 50% случаев.

Это все, что я скажу, потому что это домашняя работа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...