关于 Shuffle 实现代码的三点疑惑

2014-08-25 14:56:22 +08:00
 vexfisher
python的shuffle代码是通过随机交换两个下标的值来达到洗牌的目的。
疑惑1:为什么要用倒序循环?
疑惑2:xrange中为什么不是从0开始?
疑惑3:在语句`j= _int(random() * (i+1))`中,j可以取到的最大值是i,这样岂不是达不到交换值的目的了?我的理解是`j= _int(random() * i)` ,这样保证 0<j<i 。


def shuffle(self, x, random=None):

if random is None:
random = self.random
_int = int
for i in reversed(xrange(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i+1))
x[i], x[j] = x[j], x[i]

python新手先谢过大家了。
3477 次点击
所在节点    Python
4 条回复
hahastudio
2014-08-25 15:17:55 +08:00
vexfisher
2014-08-25 21:19:12 +08:00
"If the random number generator can return a random integer p ≤ j < q for specified parameters p, q"


@hahastudio 谢过haha君
eriale
2014-08-25 21:38:22 +08:00
具体研究过,不过洗牌程序的随机性你可以通过代码来测试,就是对一个队列反复洗牌,并统计出现的位置。
已经有人讨论过怎么测试洗牌程序了:
http://coolshell.cn/articles/8593.html

https://gist.github.com/GTxx/2796868275375f6bd877
eriale
2014-08-25 21:39:10 +08:00
@eriale 具体没研究过。。。。少打一个字

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/129781

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX