2014-01-22 29 views
6

http://docs.python.org/2/library/random.html#random.shuffle这对random.shuffle的文档意味着什么?

random.shuffle(x[, random])

洗牌序列X到位。可选参数随机是返回[0.0,1.0)中随机浮点数的0参数函数;通过 默认,这是功能random()

注意,对于即使相当小len(x),的X排列的总数大于最随机数 发生器的周期大;这意味着长序列的绝大部分排列可能永远不会生成 。

可有人请向我解释,最后一句是什么意思?

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

+2

这对我说什么,你可以洗牌,但也没有办法,你可以通过生成每_shuffling_排列,只是其中的一个子集。 –

回答

10

这意味着对于较长的列表,随机数生成器将开始重复自身,以便给定列表的不同可能“洗牌”的数量不会是列表的排列数。

对于长度为N的列表,有N!ñ阶乘)可能的方式来排列列表顺序,但是如果随机数生成器启动后少于n重演!迭代,那么random.shuffle()函数将不能产生所有的!该列表的排列组合为

它仍然可以对列表进行随机洗牌,但即使您将列表洗牌了无数次,它也不会为此列表产生所有可能的排列顺序。

默认random.random()函数使用梅森倍捻机算法,它的周期的2 ** 19937-1。这意味着你需要一个长度为2081的列表,然后才能看到这种行为发生。

+1

数学上,可以更多或更少的这样来解释:'设P为集合列表L {P1,P2,... PN}和S(由洗牌生成的可能排列的数量){S1的所有可能排列的, S2,... SM}。那么S就是每个足够长的L'的一个适当子集。 –

1

如果x 10项的序列,那么就会有一个可能的3628800名可能的顺序,其中,列表可安排..但多数随机数发生器(暂时不完全随机的)将通过一个有限的数量将周期的“随机”数字 - 这个有限的数字可能会比原来的10个元素的3,628,800可能的排列要少,所以一些可能的排列组合将永远不会因洗牌而出现。

这并不意味着就会有由随机播放功能接受了序列的大小有限制。