在Python中模拟硬币翻转实验

时间:2016-07-10 20:07:48

标签: python arrays algorithm random

我无法让程序正常运行。目标是模拟硬币翻转如下:

考虑一个随机的数字序列:epsilon_1, epsilon_2, ... , epsilon_N。此序列中的每个术语都取值+1-1,具体取决于硬币抛掷实验的结果,分别是头部或尾部。

换句话说,for each n = 1,2,...,N:

epsilon_n = { +1 with probability = 1/2; and -1 with probability = 1/2.

现在,我写了一些伪代码来帮助我编写这个程序:

# for n = 1,2,...,N:
# flip coin
# if result == "Heads"
    # epsilon_{n} = 1
# else:
    # epsilon_{n} = -1

我想在数组中为每个n(因此,每个n的实验结果)存储epsilon的值。这是我写的希望实现这个目标的程序:

    # array to store outcome of the coin flip
epsilon = np.zeros(N)

# define coin flip experiment
result = [] # result of the experiment
for n in xrange(1, N):
    def coin_flip(): #flip coin for each n = 1,...,N
        flip = random.randint(0,2) 
        if (flip == 0):
            result = "Heads"
        else:
            result = "Tails"
        return result
    if result == "Heads":
        epsilon[n] = 1
    else:
        epsilon[n] = -1

print epsilon

此程序的输出是一个数组,第一个条目为0,所有其他条目包含值-1。我指定了N = 100

请,我需要一些指导。例如,我认为我正在为硬币抛掷实验定义一个功能。我需要它来返回实验结果(Heads or Tails),并且每个n = 0,1,...,N都需要这样做,但我不确定这样做的最佳方法。然后,对于每个单独硬币翻转的结果,我的程序必须将值+1-1存储在epsilon的数组中。我必须包含n作为我提出的函数的参数吗?我在这里走在正确的轨道上吗?

非常感谢任何和所有帮助。提前谢谢!

编辑:所以我只是想指出我没有忘记导入像numpy和随机的库。这些都包含在我的原始代码中,但这实际上是较大程序的一部分,所以当我复制并粘贴这段代码时,import randomimport numpy被遗漏了

1 个答案:

答案 0 :(得分:2)

您的代码中存在多个错误。首先,您要创建一个名为result的空列表,但稍后在您的代码结果中是一个字符串。所以你不需要那个部分。

import numpy as np
import random
N = 10
epsilon = np.zeros(N)

这将创建一个长度为N的数组,供您存储结果。现在,您的主要错误在循环中。您应该在循环外定义该函数并在每次迭代中调用它:

def coin_flip(): #flip coin for each n = 1,...,N
    flip = random.randint(0, 1) 
    if (flip == 0):
        result = "Heads"
    else:
        result = "Tails"
    return result

请注意,我将第一行更改为random.randint(0, 1),因为它包含在两端。现在,如果你运行coin_flip(),它将返回“Heads”或“Tails”。 相应地改变你的循环:

for n in xrange(N):
    result = coin_flip()
    if result == "Heads":
        epsilon[n] = 1
    else:
        epsilon[n] = -1

这是修改epsilon数组的地方。请注意,在每次迭代中,我都会调用coin_flip()函数并将其分配给result

现在打印epsilon将为您提供如下数组:

array([ 1.,  1.,  1., -1., -1.,  1., -1., -1., -1., -1.])

这是很长的路要走。相反,你可以(使用随机库):

[random.choice([1, -1]) for _ in range(N)]
Out[19]: [1, 1, 1, 1, 1, -1, 1, 1, -1, -1]

或(与numpy):

np.random.choice([1, -1], N)
Out[20]: array([ 1,  1,  1,  1, -1, -1, -1, -1, -1, -1])