作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我遇到了这个问题,我想对列表进行洗牌,但只是稍微洗了一下。比如说,我只想移动少量元素。有没有一种简单的方法可以完成这项工作?
现在我能想到的最好的办法是自己动手构建方法,但是有什么方法可以使用 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/
我是一名优秀的程序员,十分优秀!