首页 > 代码库 > 如何测试洗牌程序

如何测试洗牌程序

关于洗牌程序的文章 ,之前已经写过一篇,http://www.cnblogs.com/tudas/p/3-shuffle-algorithm.html ,因为上次被nie大神们重新问到且没有正确回答上来,所以有必要在研究一下。

这次来说说n张牌的洗牌程序如何测试。众所周知,洗牌即得到n的一个全排列结果(1/n!),因此每张牌在每个位置出现的概率是1/n。

一个洗牌程序的功能是,对于长度为n的两两不同的数组,输出的任何一个排列的概率相等,也就是1/n!。可以验证,Fisher-Yates算法是可以保证这一点的。

贴上我的测试代码:

import random#测试次数test_count = 10000#记录字典counter = {}#测试集合char_array = [ a, b, c, d, e, f, g, h, i, j ]#fisher_yates洗牌算法def fisher_yates_shuffle( array ):    array_len = len( array )    for i in range( array_len - 1, -1, -1 ):        r = random.randrange( 0, array_len )        array[ i ], array[ r ] = array[ r ], array[ i ]    return array#记录每张牌在每个位置出现的次数def count( array, counter ):    for i in range( len( char_array ) ):        char = array[ i ]        pos = i + 1        if not counter.get( char ):            counter[ char ] = {}        if not counter[ char ].get( pos ):            counter[ char ][ pos ] = 0        counter[ char ][ pos ] += 1#测试test_count次for i in range( test_count ):    shuffled = fisher_yates_shuffle( char_array )    count( shuffled, counter )#打印结果for key in sorted( counter.keys() ):    print( key, counter[ key ] )

测试10000次结果:

参见:

http://blog.codingnow.com/2007/09/shuffle.html

http://coolshell.cn/articles/8593.html

如何测试洗牌程序