Как я могу имитировать флип необъективной монеты в питоне?
В непредвзятом переводе монет 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]
Ответы
Ответ 1
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
Ответ 2
Вы хотите, чтобы "смещение" основывалось на симметричном распределении? Или, может быть, экспоненциальное распределение? Гауссовый кто-нибудь?
Ну, вот все методы, извлеченные из самой случайной документации.
Во-первых, пример треугольного распределения:
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
- это форма Параметр.
Ответ 3
import random
def flip(p):
return (random.random() < p)
Это возвращает логическое значение, которое вы затем можете использовать для выбора H или T (или выбрать между любыми двумя значениями), которые вы хотите. Вы также можете включить выбор в метод:
def flip(p):
if random.random() < p:
return 'H'
else:
return 'T'
но это было бы менее полезно в этом случае.
Ответ 4
Как насчет:
import numpy as np
n, p = 1, .33 # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
Ответ 5
-
Импортируйте случайное число между 0 - 1 (вы можете использовать функцию randrange)
-
Если число выше (1-p), верните хвосты.
-
Иначе, вернуть головы
Ответ 6
Можно также выполнить выборку из 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']
Ответ 7
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() вы можете иметь любую вероятность смещения, сохраняя при этом случайность.