gpt4 book ai didi

python - 如何在 python 中轻轻地洗牌列表

转载 作者:行者123 更新时间:2023-12-02 16:37:19 28 4
gpt4 key购买 nike

我遇到了这个问题,我想对列表进行洗牌,但只是稍微洗了一​​下。比如说,我只想移动少量元素。有没有一种简单的方法可以完成这项工作?

现在我能想到的最好的办法是自己动手构建方法,但是有什么方法可以使用 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 想要的。大概率偏离对角线表示将数组旋转一个元素

关于python - 如何在 python 中轻轻地洗牌列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62436299/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com