Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何用某种“符号”生成随机方向(N、S、E、W、none);动量;?_Python_Random_Prng_Random Walk - Fatal编程技术网

Python 如何用某种“符号”生成随机方向(N、S、E、W、none);动量;?

Python 如何用某种“符号”生成随机方向(N、S、E、W、none);动量;?,python,random,prng,random-walk,Python,Random,Prng,Random Walk,我正在尝试以随机方式执行网格探索。 我能去的五个可能的方向是北、东、南、西和停留,所有这些都是同样可能的,至少最初是这样 简单地从上面选择一个随机方向的问题是,它会使我的代理过于靠近中心(两个随机方向可以很容易地相互抵消),这完全违背了随机行走的目的 我想做的是以一种随机的方式生成随机方向,它作为一个整体是无偏的,但更可能选择一个接近先前选择方向的方向 换句话说,我需要我的RNG有某种“动力” 我想出了这个算法: def RandomWithMomentum(n, momentum=0.5):

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

简单地从上面选择一个随机方向的问题是,它会使我的代理过于靠近中心(两个随机方向可以很容易地相互抵消),这完全违背了随机行走的目的

我想做的是以一种随机的方式生成随机方向,它作为一个整体是无偏的,但更可能选择一个接近先前选择方向的方向

换句话说,我需要我的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为界,那么这一点应该很明显!)


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

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

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


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

你可以在两个步骤之间存储动量(速度)吗

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


(但考虑到你生活在一个网格上,你如何量化事物,最终只移动NESW是一个复杂的问题。)

为什么不创建一个随机数0为什么不创建一个随机数0你可以使用
右转
左转
向前移动


因此,现在您需要随机向一个方向返回两次。

您可以使用
右转
左转
向前移动


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

听起来是个好主意,但我如何在2D中做到这一点?我是不是要分别做X和Y,看看向量最接近NESW中的哪一个?如果是这样,那么我如何知道我应该“停止”还是应该移动?使用两个方向(基本)向量(x和y)并设置最大和最小半径。半径为sqrt(xx+yy)。如果方向向量的长度变大,则将其截断为最大长度,但保持方向不变。如果方向不符合最小长度,则表示“不要移动”,否则按一般方向移动。这听起来是个好主意,但在2D中如何操作?我是不是要分别做X和Y,看看向量最接近NESW中的哪一个?如果是这样,那么我如何知道我应该“停止”还是应该移动?使用两个方向(基本)向量(x和y)并设置最大和最小半径。半径为sqrt(xx+yy)。如果方向向量的长度变大,则将其截断为最大长度,但保持方向不变。如果你的方向没有达到最小长度,这意味着“不要移动”,否则就朝着一般方向移动。我不确定我是否真的想“坚持当前方向”。。。有些情况下,我真的不想完全放弃向后移动。相反,我希望方向与前面的方向相似。。。这样一来,我北上后立即南下的可能性要比我先东下的可能性小。在[0,4]上选择一个随机整数的问题是,我找不到一个好方法来让它捕获相似性要求。我不确定我是否真的想“坚持当前方向”。。。有些情况下,我真的不想完全放弃向后移动。相反,我希望方向与前面的方向相似。。。这样一来,我北上后立即南下的可能性要比我先东下的可能性小。在[0,4]上选择一个随机整数的问题是,我找不到一个好的方法来让它捕获相似性要求。。。虽然我不想完全排除向后移动的可能性,但我也可以添加“停留”和“180度转弯”,然后减轻它们的重量!我喜欢这个,我想它会有用的+1哦,这很有趣。。。虽然我不想完全排除向后移动的可能性,但我也可以添加“停留”和“180度转弯”,然后减轻它们的重量!我喜欢这个,我想它会有用的+1.