基于有偏差的硬币抛掷 100 次的随机游走模拟

Random walk simulation based on the flipping of a biased coin 100 times

我 Python 开始。我正在尝试模拟一条直线(北和南)的随机游走,基于将有偏差的硬币抛 100 次,假设从起点到南为负,从起点到北为正。

我尝试了两种不同的方法,但它们都无法正常工作。

import random
def prob(p):
return random.random()<p
def random_walk(n):
heads=0
tails=0
t=0
for i in range(n):
    if prob(0.3):
        heads += 1
        t=t-1
    if prob (0.7):
        tails += 1
        t=t+1
print (heads, "heads")
print (tails, "tails")
print (t)
return t

heads=0
tails=0
t=0
for i in range(0,100):
    if prob(0.3):
        heads += 1
        t=t-1
    if prob(0.7):
        tails += 1
        t=t+1
print (heads, "heads")
print (tails, "tails")
print (t)

你做的不是掷硬币100次,而是200次!

每次调用 prob() 函数都是抛硬币。现在 for 循环的每次迭代都包含 2 次调用 - 首先是 0.3,然后是 0.7。

您正在寻找的可能类似于

for _ in range(n):
  if prob(0.3):
    heads +=1
  else:
    tails +=1

通过这种方式,您可以准确地进行 100 次抛掷(概率调用),并且每一次都是正面或反面。

此处的问题与您对 prob 函数的调用有关。由于您在 for i in range(n) 循环的每次迭代中调用该函数两次,因此您最终会得到两个不同的 RN。

此外,如果 random.random() returns,比如 0.10.2,那么与 if prob(0.3):if prob(0.7): 关联的两个 if 块将在同一个模拟循环中执行。

您需要在每个执行循环中调用一次 random.random(),并使两个 if 语句互斥 - 例如,将其更改为 if/else 块。

解决这些问题的方法如下:

for i in range(n):
    coin_has_flipped_tails = prob(0.3)
    if coin_has_flipped_tails:
        tails += 1
        t += 1
    else:  # this implies that the coin has flipped head
        heads += 1
        t -= 1