刚刚看到了一道题.

一把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

$Updateresultabby = array( 
		array( 'return' => -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";
*/
}
?>
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