【问题标题】:Simulating a random walk in Python在 Python 中模拟随机游走
【发布时间】:2017-09-24 18:32:41
【问题描述】:

我正在使用 Python 3。下面的代码尝试在 3 维中模拟 random walk 的 N 步。在每一步,随机选择一个方向(北、南、东、西、上、下),每个方向的概率为 1/6,并在该方向上采取大小为 1 的步长。然后打印新位置。起始位置是原点 (0,0)。

即使没有错误消息,代码也不起作用。我们应该在 x、y 或 z 上移动一步。但是,在输出中,我看到有时我根本不动,或者有时我朝多个方向移动。

这是我的代码:

import random

N = 30

n = random.random() 

x = 0
y = 0
z = 0
count = 0

while count <= N:

    if n < 1/6:
        x = x + 1          
        n = random.random()
    if n >= 1/6 and n < 2/6:
        y = y + 1           
        n = random.random() 
    if n >= 2/6 and n < 3/6:
        z = z + 1           
        n = random.random() 
    if n >= 3/6 and n < 4/6:
        x = x - 1           
        n = random.random() 
    if n >= 4/6 and n < 5/6:
        y = y - 1          
        n = random.random() 
    if n >= 5/6:
        z = z - 1          
        n = random.random()

    print("(%d,%d,%d)" % (x,y,z))
    count = count + 1

print("squared distance = %d" % (x*x + y*y + z*z))

你认为我可以如何解决这个问题?

非常感谢。

【问题讨论】:

  • 你使用的是 Python 2 还是 Python 3?

标签: python random-walk


【解决方案1】:

你应该使用elif 而不是这么多的ifs。每次计算 if 时,n 的值都会发生变化,然后可能符合下一个 if 的条件。

【讨论】:

    【解决方案2】:

    您不仅应该使用elif,甚至为了提高性能,而且您不需要循环中的多个n = random.random() 语句——一个就可以了:

    import random
    
    N = 30
    
    x = 0
    y = 0
    z = 0
    
    for _ in range(N):
    
        n = random.random()
    
        if n < 1/6:
            x += 1
        elif 1/6 <= n < 2/6:
            y += 1
        elif 2/6 <= n < 3/6:
            z += 1
        elif 3/6 <= n < 4/6:
            x -= 1
        elif 4/6 <= n < 5/6:
            y -= 1
        elif n >= 5/6:
            z -= 1
    
        print(f"({x},{y},{z})")  # python 3.6ism
    
    print("squared distance = {}".format(x*x + y*y + z*z))
    

    【讨论】:

      【解决方案3】:

      不管你用的是什么版本的Python,都需要实现@cdlane提供的答案。

      如果您使用的是 Python 2.X,您的另一个问题是 Python 将您的数字解释为 ints。要解决此问题,您需要将 . 添加到分母,即

      if n &lt; 1/6.:

      而不是

      if n &lt; 1/6:

      1/6 和其他分数被解释为ints - 您可以通过键入print 1/6 自己检查它,这将为您提供0 或使用print type(1/6) 打印实际类型 - 这将产生&lt;type 'int'&gt;

      因此,当您运行程序时,您的所有 ns 将仅满足最后一个条件(全部大于 0)。

      【讨论】:

      • 考虑到我们所看到的行为,实际上可能并非如此。他们可能正在使用 Python 3,其中 1/6 是用浮点除法计算的。如果这是整数除法,则每个循环都会将 z 减 1,并且不会改变其他任何内容。
      • 此更改对我没有帮助,在 Python 3.5 上进行了测试。确保您没有看到任何两个数字发生变化的行(例如,(-7,-2,2)(-7,-1,1)
      • 我尝试了您的解决方案,使用了float(6),但这对于 Python 2 来说是不够的,因为输出仍然有不正确的双重移动,例如 (-4,1,2),然后是 (-5,2,2),而不是只有一步移动尺寸 1。
      • 好的,@cdlane - 刚刚看到并看到了你的答案。确实没错。当然会进入其他ifs!我刚刚看到了转换问题,并立即引起了我的注意。
      猜你喜欢
      • 2014-03-26
      • 2014-02-19
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多