在random.shuffle的文档中,这是什么意思?

6

http://docs.python.org/2/library/random.html#random.shuffle

random.shuffle(x[, random])

在原地随机打乱序列x。可选参数random是一个返回[0.0, 1.0)的随机浮点数的无参函数;默认情况下,使用的是random()函数。

请注意,即使对于相当小的len(x)x的全排列总数也大于大多数随机数生成器的周期长度;这意味着无法随机生成较长序列的大多数排列。

有人能解释一下最后一句话是什么意思吗?

听起来好像使用shuffle可能有列表大小的限制?


2
它对我来说的意思是,你可以洗牌,但没办法通过“洗牌”生成每一种排列,只能生成其中的一个子集。 - Paulo Bu
2个回答

10
这意味着对于较长的列表,随机数生成器将开始重复自己,因此给定列表的不同“洗牌”方式数量并不等于列表的排列数。
对于长度为N的列表,有N! (N的阶乘)种可能的排列顺序,但是如果随机生成器在少于N!次迭代后开始重复,则random.shuffle()函数将无法为该列表产生所有N!个排列。
它仍然可以对列表进行洗牌,但即使您无限次地对列表进行洗牌,它也不会产生所有可能的顺序。
默认的random.random()函数使用Mersenne Twister算法,其周期为2**19937-1。这意味着您需要一个长度为2081的列表才能看到这种行为发生。

1
从数学上讲,可以更多或少地解释为:设P是列表L(p1,p2,...pn)的所有可能排列的集合,S是通过shuffle()生成的所有可能排列的数量{s1,s2,...sm}。然后对于足够长的L来说,S是P的一个真子集。 - Paulo Bu

1
如果x是由10个元素组成的序列,则有可能有3,628,800种可能的排列顺序。但大多数伪随机数生成器(并非真正随机)将会循环一定数量的“随机”数字——这个数量可能小于原始10个元素的3,628,800种可能排列,因此在洗牌的结果中,有些可能的排列顺序永远不会出现。
这并不意味着洗牌函数所接受的序列大小会有限制。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接