Domanda

Nel lancio della moneta imparziale H o T si verificano il 50% delle volte.

Ma voglio simulare una moneta che dia H con probabilità 'p' e T con probabilità '(1-p)'.

qualcosa del genere:

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]
È stato utile?

Soluzione

random.random() restituisce un numero in virgola mobile pseudo-casuale distribuito uniformemente nell'intervallo [0, 1). Questo numero è inferiore a un determinato numero p nell'intervallo [0,1) con probabilità <=>. Così:

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

Alcuni esperimenti:

>>> 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 

Altri suggerimenti

Vuoi il " bias " essere basato su una distribuzione simmetrica? O forse distribuzione esponenziale? Qualcuno gaussiano?

Bene, ecco tutti i metodi, estratti dalla stessa documentazione casuale.

Innanzitutto, un esempio di distribuzione triangolare:

print random.triangular(0, 1, 0.7)
  

random.triangular(low, high, mode) :

     

Restituisce un numero a virgola mobile casuale N tale che low <= N < high e   con la modalità specificata tra quelle   limiti. I limiti low e high   il valore predefinito è zero e uno . Il mode   l'argomento viene impostato automaticamente sul punto medio   tra i limiti, dando una simmetria   distribuzione.

     

random.betavariate(alpha, beta) :

     

Distribuzione beta. Le condizioni sui parametri sono alpha > 0 e   beta > 0. I valori restituiti sono compresi tra 0 e 1.

     

random.expovariate(lambd) :

     

Distribuzione esponenziale. lambd è 1.0   diviso per la media desiderata. Dovrebbe   essere diverso da zero . (Il parametro sarebbe   chiamato “lambda & # 8221 ;, ma questo è un   parola riservata in Python.) Restituito   i valori vanno da random.gammavariate(alpha, beta) a positivi   infinito se random.gauss(mu, sigma) è positivo e   da infinito negativo a mu se sigma   è negativo.

     

normalvariate() :

     

Distribuzione gamma. (Non la gamma   funzione!) Condizioni sul   i parametri sono random.lognormvariate(mu, sigma) e random.normalvariate(mu, sigma).

     

random.vonmisesvariate(mu, kappa) :

     

Distribuzione gaussiana. 2*pi è la media e kappa è lo standard   deviazione. Questo è leggermente più veloce   rispetto alla funzione random.paretovariate(alpha)   definito di seguito.

     

alpha :

     

Registra la distribuzione normale. Se prendi   il logaritmo naturale di questo   distribuzione, & # 8217; otterrai una normalità   distribuzione con media random.weibullvariate(alpha, beta) e standard   deviazione beta. <=> può avere qualsiasi   valore e <=> deve essere maggiore di    di zero .

     

<=> :

     

Distribuzione normale. <=> è la media,   e <=> è la deviazione standard.

     

<=> :

     

<=> è l'angolo medio, espresso in   radianti tra <=> e <=> e <=>   è il parametro di concentrazione, che   deve essere maggiore o uguale a zero .   Se <=> è uguale a zero , questo   la distribuzione si riduce a un'uniforme   angolo casuale nell'intervallo da <=> a <=>.

     

<=> :

     

Distribuzione di Pareto. <=> è il   parametro shape.

     

<=>

     

Distribuzione Weibull. <=> è il   parametro di scala e <=> è la forma   parametro.

import random
def flip(p):
    return (random.random() < p)

Questo restituisce un valore booleano che puoi quindi usare per scegliere H o T (o scegliere tra due valori qualsiasi) che desideri. Puoi anche includere la scelta nel metodo:

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

ma sarebbe generalmente meno utile in questo modo.

Che ne dici di:

import numpy as np
n, p = 1, .33  # n = coins flipped, p = prob of success
s = np.random.binomial(n, p, 100)
  • Importa un numero casuale tra 0 - 1 (puoi usare la funzione randrange)

  • Se il numero è sopra (1-p), restituisci le code.

  • Altrimenti, testa di ritorno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top