Подтвердить что ты не робот

Как я могу имитировать флип необъективной монеты в питоне?

В непредвзятом переводе монет 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]
4b9b3361

Ответ 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() вы можете иметь любую вероятность смещения, сохраняя при этом случайность.