Как мне симулировать подбрасывание смещенной монеты в питоне? - PullRequest
24 голосов
/ 25 января 2009

В несмещенной монете переворот 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]

Ответы [ 5 ]

45 голосов
/ 25 января 2009

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 
8 голосов
/ 26 января 2009

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

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

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

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 is 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 это форма параметр.

4 голосов
/ 24 августа 2014

Как насчет:

import numpy as np
n, p = 1, .33  # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
4 голосов
/ 25 января 2009
import random
def flip(p):
    return (random.random() < p)

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

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

но в целом это было бы менее полезно.

0 голосов
/ 25 января 2009
  • Импортировать случайное число в диапазоне от 0 до 1 (вы можете использовать функцию ранда)

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

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

...