本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh) 本文作者: 苏洋 创建时间: 2012年01月10日 统计字数: 1703字 阅读时间: 4分钟阅读 本文链接: https://soulteary.com/2012/01/10/%E4%B8%80%E9%81%93%E8%B6%A3%E5%91%B3%E9%A2%98.html ----- # 一道趣味题 刚刚看到了一道题. > 一把1级屠龙刀,最高可以升到9级,每次升级成功率30%,失败率70%。失败会退一级,最差退到1级。 那么在1000次内升级到9级的概率为多少? 尝试写了一个php的模拟,第一次没设定失败下限.结果很给力. > 第994次升级结果:屠龙刀等级为:-358! 第995次升级结果:屠龙刀等级为:-359! 第996次升级结果:屠龙刀等级为:-358! 第997次升级结果:屠龙刀等级为:-359! 第998次升级结果:屠龙刀等级为:-360! 第999次升级结果:屠龙刀等级为:-361! 后来运气好了一次. > 第342次升级结果:屠龙刀等级为:7!最高等级为7 第343次升级结果:屠龙刀等级为:8!最高等级为8 第344次升级结果:屠龙刀等级为:9!最高等级为9 坑爹九级神器! 代码如下,群里有个大大的高端代码,我也留下来。 ```php -1, 'range' => '70' ), array( 'return' => 1, 'range' => '30' ) ); $level =1 ; $level_max =2; for( $i = 0; $i < 2000; $i++ ){ $KeyNum = mt_rand( 0, 99 ); $NumRange = 0; $KeyGet = 0; foreach( $Updateresultabby as $tmp ){ $result = intval( $tmp['range'] ); if( ($KeyNum >= $NumRange) && ($KeyNum < ($NumRange + $result)) ){ $KeyGet = $tmp['return']; break; } else{ $NumRange += $result; } } if($level==9){echo "坑爹九级神器!";break;} $level +=$KeyGet; if($level>$level_max){$level_max = $level;} if($level==0){$level=1;} printf("第%s次升级结果:", $i); printf("屠龙刀等级为:%s!最高等级为%s", $level,$level_max); echo "\r\n"; /* printf("第%s次计算结果:", $i); print_r ($KeyGet); echo "\n"; */ } ?> ``` ```c public class Knife { private static final int times = 1000; private static final int max = 9; private static double[][] sheet; private static double p(int n, int k) { double result; if (sheet[n][k] != -1) { result = sheet[n][k]; } else if (n == 0) { result = 0; } else if (n == 1 && k == 1) { result = 0.7; } else if (n < k - 1) { result = 0; } else if (n == k - 1) { result = Math.pow(0.3, n); } else if (k >= max - 1) { result = p(n - 1, k - 1) * 0.3; } else if (k == 1) { result = p(n - 1, 2) * 0.7 + p(n - 1, 1) * 0.7; } else { result = p(n - 1, k - 1) * 0.3 + p(n - 1, k + 1) * 0.7; } sheet[n][k] = result; return result; } public static void main(String[] args) { sheet = new double[times + 1][max + 1]; for (int i = 0; i < times + 1; i++) { for (int j = 0; j < max + 1; j++) { sheet[j] = -1; } } double rate = 0; for (int i = max - 1; i <= times; i++) { rate += p(i, max); } System.out.println(rate); } } 计算结果是0.22855682741303354 ```