刚刚看到了一道题.
一把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