猜数游戏的算法及如何计算最多需要的步骤
猜数游戏如下:
人随意想一个四位数,四位数两两不相同,首位可为0,由计算机猜。
猜的步骤如下:
计算机给出一个四位数,人来回答这计算机的四位数中,有多少个是数字猜对,且位置也猜对的,有多少个是数字猜对,但位置为未猜对的。多次重复此步骤,直至计算机猜对为止。
例如:人产生的四位数为:1234,计算机第一次猜2534,这时人应给出回答:有2个数字猜对了,且位置也对(3和4),有1个数字猜对了,但位置不对(2),简记为2A1B。(A表示数字对且位置对,B表示数字对但位置不对)。第二次计算机猜2789,这时人应回答0A1B(因为没有一个数字是数字对且位置也对,所以写0A,数字2猜对但位置不对,写作1B)。直至计算机猜中1234.
我已经想出一个算法并实际验证和统计,8步以内猜出来的概率在万分之五以内,最多的是9步猜出来,平均在5.5-5.8步猜出来。
5万次猜数统计结果如下:
平均步数:5.61208
最大步数:9,最大步数发生位置:1193
步数 : 个数 - 百分比
0: 0.00 0.00%
1: 10.00 0.02%
2: 34.00 0.07%
3: 675.00 1.35%
4: 4,780.00 9.56%
5: 16,311.00 32.62%
6: 20,323.00 40.65%
7: 7,068.00 14.14%
8: 779.00 1.56%
9: 20.00 0.04%
10: 0.00 0.00%
问题:这种游戏所需的步骤在“一般情况下”最多是否需要9步?如是,则是如何计算出来的?
如不是,能否给出一个更优的算法来?
我的算法如下:
如第一步猜abcd 答案是0A2B则可计算如下:
可以作为答案的四位数的总数是10*9*8*7=5040;
对于0A2B的答案,可以计算:1、有第一步abcd的4个数里,其中有两个正确,C(4,2)=6种组合为正确的数;
2、但是,其中第一个正确的数除在其本位不对外,有3个可选的位置而第2个正确的数的位置有两种情况:
甲、第一个正确的数的一个可选位置恰好在第二个正确数的本位。则第2个数有3种可选的位置,
乙、第一个正确的数的其他两个可选位置和第个正确数的本位不一致,则第2个数有两种可选的位置。
所以位置可能性,计算得(1*3+2*2)=7
3、剩下的两个正确的数,在剩下的6位数里。其位置的可能性有c(6,2)*2=30
以上3个因子相乘6*7*30=1260.
这样,通过第一步的0A2B的答案过滤,5040个数里,被过滤得剩下了1260.
以下为某次具体猜数的过程:
1:0921 0A2B 1260个可能结果
2:7684 0A1B 504个可能结果
3:3079 0A1B 117个可能结果
4:1236 0A1B 38个可能结果
5:5108 1A2B 6个可能结果
6:5410 0A2B 3个可能结果
7:8195 1A1B 2个可能结果
8:8502 1A3B 1个可能结果
9:2805 4A0B