您的位置:首页 > 其它

计算随机概率 p 下取 N 个0,1, 出现 M 个 0 的概率

2016-05-26 00:00 375 查看
<?php

/**
* 计算随机概率 p 下取 N 个0,1, 出现 M 个 0 的概率.
*
* 二项式系数公式: C(n,r) = n! / r!(n-r)!
*/

define('N', 30);
define('M', 15);
define('P', 0.02257);   # 0.02257

echo "Hello World!\n";

# 测试: 计算阶乘.
if (false) {
for ($i = 1; $i < N; ++$i) {
$f = factorial($i);
echo "factorial($i) is $f\n";
}
}

# 测试计算二项式系数.
if (false) {
$N = N;
for ($i = 0; $i <= N; ++$i) {
$bin_factor = binomial_factor(N, $i);
echo "bin_factor C($N, $i) is : $bin_factor\n";
}
}

# 实际计算概率.
if (true) {
$N = N;
$p = P;             # 得到 0 的概率 p.
$q = 1 - $p;        # 得到 1 的概率 q.
$sigma_p = 0;
for ($i = 0; $i <= N; ++$i) {
$bin_factor = binomial_factor(N, $i);
$i_p = pow($p, N-$i);
$i_q = pow($q, $i);
$pp = $bin_factor * $i_p * $i_q;

$sigma_p += $pp;
echo "[$i] \t$pp \t\t$sigma_p\n";
}
}

exit();

# 二项式定理 系数计算.
function binomial_factor($n, $r) {
# C(n,r) = n! / r!(n-r)!
$n_f = factorial($n);
$r_f = factorial($r);
$nr_f = factorial($n - $r);

$factor = $n_f / $r_f / $nr_f;
return $factor;
}

# 计算数字 $i 的阶乘, 使用记忆器加快计算速度.
$factorial_memory = ['1' => 1, '2' => 2, '3'=> 6, '4'=>24, '5' => 120];
function factorial($i) {
global $factorial_memory;
if ($i == 0) return 1;
if ($i == 1) return 1;

if (isset($factorial_memory[$i]))
return $factorial_memory[$i];

$result = $i * factorial($i - 1);
$factorial_memory[$i] = $result;
return $result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: