2

我正在尝试以随机方式探索网格。
我可以去的五个可能的方向是北、东、南、西和停留,所有这些都是同样可能的,至少在最初是这样。

从上面简单地选择一个随机方向的问题在于它最终使我的代理离中心太近(两个随机方向很容易相互抵消),这完全违背了随机游走的目的。

想做的是以随机方式生成随机方向,整体上是无偏的,但更有可能选择接近先前选择的方向的方向

换句话说,我需要我的 RNG 有某种“动力”。

我想出了这个算法:

def RandomWithMomentum(n, momentum=0.5):
    from random import uniform
    v = uniform(-1, 1)
    for i in range(n):
        yield v
        v = v * momentum + uniform(-1, 1) * (1 - momentum)

这似乎给出了很好的结果:

-0.04367186243339227
-0.1798381656787107
-0.07608795741137708
-0.0728742899528114
-0.06215075604982321
 0.17952360050689026
 0.016352984710556573
 0.16954506853320414
 0.3947467183848671
 0.12785652121165636

...除了虽然该算法保证正数和负数的可能性相同,但它不能保证从 -1 到 +1 的区间内均匀分布!

(如果您意识到数字不一定以 -1 和 +1 为界,这应该很明显!)

所以我的问题是,我如何将这个(或其他算法)扩展到选择五个方向之一,而不仅仅是一个正数或负数?

4

3 回答 3

2

您可以使用turn right, turn left,move forward作为可能的移动。

所以现在你需要随机到一个方向两次才能返回。

于 2012-11-22T09:57:17.857 回答
1

您是否允许在步骤之间存储动量(速度)?

如果是这样,那么最好的办法可能是在每个时间步选择一个速度——即速度和方向——这就像一个矢量一样添加到先前的速度。无论如何,这是更现实的物理学,因为力会改变动量。

(但考虑到你生活在一个网格上,你如何量化事物会很复杂,以至于你最终只能移动 NESW。)

于 2012-11-22T09:30:08.010 回答
1

为什么不直接创建一个随机数 0 <= r <= 4 并将其映射到一个方向(假设方向 0 是“不要移动”)?

我看到你的随机游走太随机的问题,我可能会尝试坚持你的方向一段时间(你也可以使用随机数来确定多长时间)然后重新决定。在我看来,这至少是基于现实的:通常,如果你决定走向某个方向,你会做一段时间,而不是考虑每隔 x 秒就改变主意。

http://docs.python.org/2/library/random.html展示了如何使用随机数函数。random.uniform() 为您提供浮动的均匀分布。将 random.randint() 用于整数结果(我想也是统一的)。

于 2012-11-22T09:46:58.780 回答