2017-02-04 4 views
0

J'essaie d'écrire une fonction qui simule X nombre d'expériences de retournement de pièces biaisées (H = 0.6, T = 0.4), qui consiste en N retournements de pièces, pour répondre à la question " Quelle est la valeur attendue du nombre de groupes après les retournements de pièces N? " Le groupe, par définition, est la séquence maximale des mêmes valeurs dans un ordre consécutif. Par exemple: ['H', 'H', 'H', 'H', 'H', 'H', 'T', 'H', 'H', 'H'] a 3 groupes et ['T', 'H', 'H', 'H', 'T', 'T', 'H', 'H', 'H', 'H'] a 4 groupes.Python - Répéter une expérience de retournement de pièces biaisée

# Libraries 
import random 
from itertools import groupby 
from itertools import chain 

# Function for biased coin 
def flip(p): 
    return 'H' if random.random() < p else 'T' 

# Number of coin flips 
N = 10 
flips = [flip(0.6) for i in range(N)] 
print (len(list(groupby(flips)))) 

# Function to simulate X iterations of N coin flips 
def simulate(X, N): 
    Outcome = [] # Empty list to store each experiment's result 
    # X Number of coin simulations 
    for i in range(X): 
     # Coin simulation of N flips 
     flips = [flip(0.6) for j in range(N)] 
     # Append experiment's result into Outcome list 
     Outcome.append(len(list(groupby(flips)))) 
    # Expected Value of the number of groups 
    sum(Outcome)/X 

Une idée pourquoi cela ne fonctionne pas? J'ai l'erreur suivante TypeError: unsupported operand type(s) for /: 'list' and 'int'

+0

Que signifie "ne fonctionne pas"? 'Outcome/X' (diviser une liste par un entier - pas une chose) en fait probablement partie, mais autre chose? – Ryan

+0

Ca marche pour moi! Qu'attendez-vous et qu'est-ce que vous obtenez qui vous fait sentir que cela ne fonctionne pas! – Shobeir

+0

J'ai eu l'erreur suivante 'TypeError: type (s) d'opérande non supporté (s) pour /: 'list' et 'int' –

Répondre

1

Vous divisez une liste par un nombre. Et vous devez utiliser return dans votre fonction.

def simulate(X, N): 

    Outcome = [] # Empty list to store each experiment's result 
    # X Number of coin simulations 
    for i in range(X): 
     # Coin simulation of N flips 
     flips = [flip(0.6) for j in range(N)] 
     # Append experiment's result into Outcome list 
     Outcome.append(len(list(groupby(flips)))) 
    X = float(X) 
    # Expected Value of the number of groups 
    return sum(Outcome)/X 
+0

Le dénominateur est faux –

+0

Je ne pense pas. – Shobeir

0
# Libraries 
import random 
from itertools import groupby 
from itertools import chain 

# Function for biased coin 
def flip(p): 
    return 'H' if random.random() < p else 'T' 

# Number of coin flips 
N = 10 
flips = [flip(0.6) for i in range(N)] 
print (len(list(groupby(flips)))) 

# Function to simulate X iterations of N coin flips 
def simulate(X, N): 
    Outcome = [] 
    for i in range(X): 
     flips = [flip(0.6) for j in range(N)] 
     Outcome.append(len(list(groupby(flips)))) 
    print(sum(Outcome)/(X)) 
1

Vous essayez de prendre la moyenne des résultats, donc au lieu de les stocker dans une liste, vous voulez les additionner et diviser par le nombre d'essais.

def simulate(x, n): 
    outcome = 0.0 
    for i in range(x): 
     flips = [flip(0.6) for j in range(n)] 
     outcome += len(list(groupby(flips))) 
    return outcome/x 
+0

Le dénominateur est faux –

+0

C'est la moyenne des échantillons 'x'. –