我有一个问题想在这里整理一下列表,但是只做些许。说,我只希望移动少量元素。有没有简单的方法可以做到这一点?
现在,我能想到的最好的方法就是手动构建自己的方法,但是有什么方法可以使用该random
库为我做到这一点?
展示其中一些解决方案的工作方式,我发现它有助于多次运行蒙特卡洛算法并查看分布情况
首先是@ meta4解决方案的整理版本,因为它是最充实的:
from random import randrange
def partial_shuffle(l, factor=5):
n = len(l)
for _ in range(factor):
a, b = randrange(n), randrange(n)
l[b], l[a] = l[a], l[b]
我们可以通过执行以下操作来多次运行:
import numpy as np
n = 8
orig = list(range(n))
occur = np.zeros((n, n), int)
for _ in range(100000):
x = orig[:]
partial_shuffle(x,1)
occur[orig,x] += 1
如果我们将出现率表打印为百分比,则得到:
[[33.5 9.6 9.5 9.4 9.4 9.6 9.5 9.5]
[ 9.6 33.2 9.7 9.5 9.6 9.6 9.4 9.4]
[ 9.5 9.6 33.2 9.5 9.6 9.5 9.6 9.5]
[ 9.5 9.3 9.6 33.4 9.5 9.5 9.5 9.6]
[ 9.4 9.6 9.4 9.6 33.3 9.5 9.7 9.5]
[ 9.6 9.5 9.6 9.6 9.4 33.3 9.5 9.6]
[ 9.4 9.7 9.5 9.5 9.5 9.6 33.2 9.7]
[ 9.5 9.5 9.6 9.5 9.7 9.5 9.6 33.2]]
每行表示项目移至列的概率。在这种情况下(当时n=8
),算法会倾向于将元素保留在大约33%的时间,然后均匀地选择其余元素
然后,我可以使用以下命令运行(整理)pjs代码的版本:
from random import gauss
orderliness = 2
occur = np.zeros((n, n), int)
for _ in range(100000):
x = sorted(orig, key=lambda i: gauss(i * orderliness, 1))
occur[orig,x] += 1
这给出了非常不同的输出:
[[91.9 7.9 0.1 0. 0. 0. 0. 0. ]
[ 7.9 84.1 7.8 0.1 0. 0. 0. 0. ]
[ 0.1 7.8 84.1 7.9 0.1 0. 0. 0. ]
[ 0. 0.1 7.9 84.1 7.7 0.1 0. 0. ]
[ 0. 0. 0.1 7.7 84.2 7.8 0.1 0. ]
[ 0. 0. 0. 0.1 7.9 84.2 7.7 0.1]
[ 0. 0. 0. 0. 0.1 7.7 84.2 7.9]
[ 0. 0. 0. 0. 0. 0.1 7.9 91.9]]
即项目倾向于保持在接近开始的位置
此类表格非常适合检测分布中的偏差,似乎没有上述证据。但是,例如,使用Artyom的解决方案(shuffle(x, lambda: random() / 5)
)给出以下信息:
[[ 0. 37.4 0. 0. 0. 16.7 23.8 22.1]
[ 0. 0. 100. 0. 0. 0. 0. 0. ]
[ 0. 0. 0. 100. 0. 0. 0. 0. ]
[ 0. 0. 0. 0. 100. 0. 0. 0. ]
[ 1.7 0. 0. 0. 0. 83.3 11.9 3. ]
[ 9. 7.4 0. 0. 0. 0. 64.2 19.4]
[ 26.7 17.9 0. 0. 0. 0. 0. 55.5]
[ 62.6 37.4 0. 0. 0. 0. 0. 0. ]]
这可能不是OP想要的。对角线的高概率表示将数组旋转一个元素
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句