我正在尝试以随机方式探索网格。
我可以去的五个可能的方向是北、东、南、西和停留,所有这些都是同样可能的,至少在最初是这样。
从上面简单地选择一个随机方向的问题在于它最终使我的代理离中心太近(两个随机方向很容易相互抵消),这完全违背了随机游走的目的。
我想做的是以随机方式生成随机方向,整体上是无偏的,但更有可能选择接近先前选择的方向的方向。
换句话说,我需要我的 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 为界,这应该很明显!)
所以我的问题是,我如何将这个(或其他算法)扩展到选择五个方向之一,而不仅仅是一个正数或负数?