首页 > 代码库 > 如何测试洗牌程序
如何测试洗牌程序
关于洗牌程序的文章 ,之前已经写过一篇,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
如何测试洗牌程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。