擅长:python、mysql、java
<p>使用<code>random</code>的固定值洗牌不起作用!示例:</p>
<pre><code>from random import shuffle
v = sum([[k] * 100 for k in range(10)], [])
print v[:40]
shuffle(v, random = lambda: 0.7)
print v[:40]
</code></pre>
<p>给出输出:</p>
<pre><code>[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 8, 0, 0, 9, 0, 0, 0, 9, 0, 0, 8, 0, 0, 7, 0, 0, 0, 9, 0, 0, 7, 0, 0, 8, 0, 0, 0, 7, 0, 0, 7, 0, 0, 8, 0, 0, 0, 9]
</code></pre>
<p>其他种子也一样-不是很随机的(不管怎么说第一眼。。。很难证明)。这是因为<code>random</code>不是种子-它被多次重用。演示:</p>
<pre><code>def rand_tracker():
rand_tracker.count += 1
return random()
rand_tracker.count = 0
shuffle(v, random = rand_tracker)
print 'Random function was called %d times for length %d list.' % (rand_tracker.count, len(v))
</code></pre>
<p>这表明:</p>
<pre><code>Random function was called 999 times for length 1000 list.
</code></pre>
<p>你应该做的是@abarnert的建议:</p>
<pre><code>from random import Random
Random(4).shuffle(x)
</code></pre>
<p>在这种情况下,固定值是完全正确的。</p>
<p><strong>TLDR</strong>:使用@abarnert的答案,不要为<code>random</code>使用固定值函数!</p>