Как я моделирую зеркальное отражение смещенной монеты в Python?

В несмещенном подбрасывании монеты H или T происходит 50% времен.

Но я хочу моделировать монету, которая дает H с вероятностью 'p' и T с вероятностью' (1-p)'.

что-то вроде этого:

def flip(p):
   '''this function return H with probability p'''
   # do something
   return result

>> [flip(0.8) for i in xrange(10)]
[H,H,T,H,H,H,T,H,H,H]
25
задан Sandipan Dey 11 September 2019 в 08:53
поделиться

6 ответов

random.random() возвраты равномерно распределенный псевдослучайное число с плавающей точкой в диапазоне [0, 1). Это число является меньше, чем данный номер p в диапазоне [0,1) с вероятностью p. Таким образом:

def flip(p):
    return 'H' if random.random() < p else 'T'

Некоторые эксперименты:

>>> N = 100
>>> flips = [flip(0.2) for i in xrange(N)]
>>> float(flips.count('H'))/N
0.17999999999999999  # Approximately 20% of the coins are heads

>>> N = 10000
>>> flips = [flip(0.2) for i in xrange(N)]
>>> float(flips.count('H'))/N
0.20549999999999999  # Better approximation 
45
ответ дан Federico A. Ramponi 28 November 2019 в 18:25
поделиться

Вы хотите, чтобы "смещение" было основано на симметричном распределении? Или, может быть, экспоненциальное распределение? Гауссовский кто-нибудь?

Ну, вот все методы, взятые из самой случайной документации.

Во-первых, пример треугольного распределения:

print random.triangular(0, 1, 0.7)

random.triangular(low, high, mode) :

Возвращает случайное число с плавающей запятой N, такое что low <= N < high и с указанным режимом между этими границами. Границы low и high по умолчанию равны нулю и единице . По умолчанию аргумент mode соответствует средней точке между границами, что дает симметричное распределение.

random.betavariate(alpha, beta) :

Бета-распределение. Условиями параметров являются alpha > 0 и beta > 0. Диапазон возвращаемых значений между 0 и 1.

random.expovariate(lambd) :

Экспоненциальное распределение. lambd делится на 1.0 на желаемое среднее значение. Должен быть ненулевой . (Параметр будет называться « lambda », но это зарезервированное слово в Python.) Возвращаемые значения варьируются от 0 до положительной бесконечности , если lambd положительно и от отрицательная бесконечность до 0, если lambd отрицательно.

random.gammavariate(alpha, beta) :

Гамма-распределение. (Не гамма-функция!) Условия для параметров: alpha > 0 и beta > 0.

random.gauss(mu, sigma) :

Гауссово распределение. mu - это среднее значение, а sigma - стандартное отклонение. Это немного быстрее, чем функция normalvariate(), определенная ниже.

random.lognormvariate(mu, sigma) :

Регистрировать нормальное распределение. Если вы возьмете натуральный логарифм этого распределения, вы получите нормальное распределение со средним mu и стандартным отклонением sigma. mu может иметь любое значение, и sigma должно быть больше, чем ноль .

random.normalvariate(mu, sigma) :

Нормальное распределение. mu - это среднее значение, а sigma - стандартное отклонение.

random.vonmisesvariate(mu, kappa) :

mu - средний угол, выраженный в радианах между 0 и 2*pi, а kappa - параметр концентрации, который должен быть больше или равно нулю . Если kappa равно нулю , это распределение уменьшается до равномерного случайного угла в диапазоне от 0 до 2*pi.

random.paretovariate(alpha) :

Распределение по Парето. alpha - это параметр формы.

random.weibullvariate(alpha, beta)

Распределение Вейбулла. alpha является параметром масштаба, а beta является параметром формы.

8
ответ дан nosklo 28 November 2019 в 18:25
поделиться
import random
def flip(p):
    return (random.random() < p)

Возвращает логическое значение, которое затем можно использовать для выбора H или T (или выбора между любыми двумя значениями), которые вы хотите. Вы также можете включить выбор в метод:

def flip(p):
    if random.random() < p:
        return 'H'
    else:
        return 'T'

, но в целом он будет менее полезен.

4
ответ дан David Z 28 November 2019 в 18:25
поделиться
  • Импортировать случайное число в диапазоне от 0 до 1 (вы можете использовать функцию randrange)

  • Если число выше (1-p), вернуть хвосты.

  • Остальное, возвратные головки

0
ответ дан Colin 28 November 2019 в 18:25
поделиться

Можно выбрать от X ~ Bernoulli(p) распределение nsamples времена с помощью sympy также:

from sympy.stats import Bernoulli, sample_iter
list(sample_iter(Bernoulli('X', 0.8), numsamples=10)) # p = 0.8 and nsamples=10
# [1, 1, 0, 1, 1, 0, 1, 1, 1, 1]

Возврат 'H' или 'T' вместо этого использование

def flip(p, n):
    return list(map(lambda x: 'H' if x==1 else 'T', sample_iter(Bernoulli('X', p), numsamples=n)))

print(flip(0.8, 10)) # p = 0.8 and nsamples=10
# ['H', 'H', 'T', 'H', 'H', 'T', 'H', 'H', 'H', 'H']
0
ответ дан 28 November 2019 в 18:25
поделиться
import random
def flip():
    return ["H" if random.randint(0,3) <= 2 else "T" for i in range(10)]

Прямо сейчас вероятность Головы составляет 75%, и хвосты 25% (0,1,2, все Головы, и только 3 - Хвосты). При помощи random.randint () у Вас могла быть любая вероятность предвзятости при тихом поддержании случайности.

0
ответ дан 28 November 2019 в 18:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: