关于python:random.shuffle随机性

random.shuffle Randomness

我正在尝试编写一种遗传算法进行作业,以解决旅行商问题。

我正在尝试的变异函数之一是在巡回赛中使用random.shuffle

阅读random.shuffle的文档时,我看到:

1
2
3
4
5
shuffle(self, x, random=None, int=<type 'int'>) method of random.Random instance
x, random=random.random -> shuffle list x in place; return None.

Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.

有人可以在此函数中解释"随机"参数的功能吗?
我已经阅读了这个问题,但是没有回答我的问题。

如果我可以某种方式控制混洗的随机性,我尤其想使用此功能(如果有任何意义)


random参数用于指定(另一个)随机数生成器。它是一个函数,期望返回0 <= x <1范围内的统一随机数

如果从随机数生成器两次返回相同的数字,则随机播放将是相同的。例如,

1
2
3
4
5
6
7
8
9
10
11
def mynonrandom():
 return 0.1

q
[1, 2, 3, 4]
random.shuffle(q, mynonrandom)
q
[2, 3, 4, 1]
random.shuffle(q, mynonrandom)
q
[3, 4, 1, 2]

请注意,在这种特殊情况下,每次都将-1移位。从随机输入中获得的确切信息可能取决于random.shuffle的实现。

对于遗传算法,您希望能够具有随机大小的随机大小变化。使用random.shuffle不能做到这一点。您可能需要定义一些示例变化(例如,与距离N交换成对),然后随机化(使用您要定义的一些参数)对每个新基因集执行多少操作。


shuffle库例程可让您提供随机数源(如果没有,则将使用内置默认值)。因此,从理论上讲,如果您有更好的随机数源-也许是连接到Geiger计数器的设备或"白噪声"广播电台,或者是从random.org获取数字的设备-则可以改用它。如果您正在测试,可能会更有用,您可以连接一个返回相同数字序列的源,这将确保您的测试用例可重复,并始终每次都产生相同的洗牌。

从理论上讲,您可以开发一个随机数例程,该例程将使您可以精确控制随机播放的随机播放次数;但这意味着您需要确切地了解shuffle的工作原理,以及必须返回的数字以将结果"引导"到他们想要去的地方。从理论上讲...并不是很困难,使用的算法非常有据可查(Fisher-Yates),并且在调用过程中会生成n-1随机数,这是第一个从索引0到n-1中选择元素的方法,与最后一个元素交换,第二个从0到索引n-2中选择一个元素,与最后一个但是交换一个元素,依此类推。所以是的,您可以使用它来控制随机播放,例如@JohanLundberg示例,它强制随机播放移动-但是使用它来控制随机播放非常困难(因为每次迭代,所有原始数据都在跳来跳去)。

简短的答案,如果您需要对改组进行特定的约束,例如"仅交换相邻的元素",那么最好自己实现,也许可以使用改组源代码作为指南。


如Johan所说,random参数只是为shuffle函数使用提供了随机性。因此,您可以使用默认值或提供您自己的默认值。因此,如果您希望它具有更好的随机性,则可以找到比python更好的库。

根据您对我评论的回复,听起来您正在寻找距离而不是随机性。您可能需要一组n个随机混洗并最大化距离。要计算距离,您可以使用一些我没有寻找但确实存在的实现方法。