这在random.shuffle的文档中意味着什么?

时间:2014-01-22 13:54:26

标签: python random

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

  

random.shuffle(x[, random])

     

将序列 x 拖放到位。可选参数 random 是一个0参数函数,在[0.0,1.0)中返回一个随机浮点数;通过   默认情况下,这是函数random()

     

请注意,对于相当小的len(x) x 的排列总数大于大多数随机数的周期   发电机;这意味着长序列的大多数排列都可以   永远不会被生成。

有人可以向我解释最后一句话的含义吗?

听起来你可以或应该使用shuffle对列表大小有限制吗?

2 个答案:

答案 0 :(得分:10)

这意味着对于更长的列表,随机数生成器将开始重复自身,因此给定列表的不同可能“随机播放”的数量不会是列表的排列数。

对于长度 N 的列表,有 N! N 阶乘)可能的方式来置换列表顺序,但如果随机生成器在少于N后开始重复!迭代,然后random.shuffle()函数将无法为该列表生成所有 N!排列。

它仍然可以随机播放列表,但即使你无限次地对列表进行了混乱,也不会为这样的列表生成所有可能的顺序。

默认random.random()函数使用Mersenne Twister算法,其周期为2 ** 19937-1。这意味着在您看到此行为发生之前,您需要一个长度为2081的列表。

答案 1 :(得分:1)

如果x是10个项目的序列,则可能有3,628,800个可能的订单,其中可以排列列表..但是大多数随机数生成器(不是真正随机的)将循环通过有限数量的“随机”数字 - 这个有限数字可能小于原始10个元素的3,628,800个可能的排列,因此一些可能的排列永远不会因为改组而出现。

这并不意味着shuffle函数接受的序列大小会有限制。