PHP计算 地摊游戏小飞棍概率

游戏规则

红黄蓝三种颜色的棍子各九根,放入一个纸箱取出九根,按各颜色棍子的数量获奖,

结果   分别为 900(即9根小棍颜色相同),018,027,036,045,117,126,135,144,225,234,333。

数学公式

P = C(9,N)xC(9,N)xC(9,N)x A(3, M) / C(27, 9)

此问题中从27个小球中取出9个小球,共三种情况
第一种, 三个数字相同,即3,3,3,相互对应N值,此情况M值为0
第二种, 三个数字都不相同, 例如 2,3 ,4,相互对应N值,此情况M值为3
第三种, 三个数字中任意两个相同, 例如,1,4,4,相互对应N值,此情况M值为1

C(n,k)计算方法
// 函数计算组合数 C(n, k)
function comb($n, $k) {
    // 计算组合数 C(n, k)
    $result = 1;
    for ($i = 0; $i < $k; $i++) {
        $result *= ($n - $i) / ($i + 1);
    }
    return intval($result);
}

A(n,k)计算方法
// 函数计算组合数 A(n, k)
function A($a,$b){
    // 函数计算排列数 A(n, k)
    function perm($n, $k) {
        // 计算 n 的阶乘
        $nFactorial = factorial($n);

        // 计算 (n - k) 的阶乘
        $kFactorial = factorial($n - $k);

        // 返回排列数 A(n, k)
        return intval($nFactorial / $kFactorial);
    }

// 辅助函数计算阶乘
    function factorial($n) {
        $result = 1;
        for ($i = 2; $i <= $n; $i++) {
            $result *= $i;
        }
        return $result;
    }

// 计算 A(3, 0)
    return perm($a, $b);
}
全部代码
function XFGun($numValue){
    $str = (string)$numValue;
    $arr = str_split($str);
    if (!is_numeric($numValue)) {
        echo "只能输入数字,请重新输入";
        return '';
    }
    if (sizeof($arr) != 3){
        echo "只能输入三个数字,请重新输入";
        return '';
    }
    if (array_sum($arr) != 9) {
        echo "三个数字和不等于9,请重新输入";
        return '';
    }
    // 总的小球数量和每种颜色的小球数量
    $totalBalls = 27;
    $redBalls = 9;
    $yellowBalls = 9;
    $blueBalls = 9;

    // 要抽取的小球数量
    $ballsToDraw = 9;

    // 特定的颜色组合(红2、黄3、蓝4)
    $red = $arr[0];
    $yellow = $arr[1];
    $blue = $arr[2];

    if ($red == $yellow && $red == $blue){
        $a = A(3,0);
        $AStr = "A(3,0)";
    }
    elseif ($red != $yellow && $red != $blue && $yellow != $blue){
        $a = A(3,3);
        $AStr = "A(3,3)";
    }
    else{
        $a = A(3,1);
        $AStr = "A(3,1)";
    }
    // 计算 C(9, 3)
    $combRed = comb($redBalls, $red);
    $combYellow = comb($yellowBalls, $yellow);
    $combBlue = comb($blueBalls, $blue);


    // 计算 C(27, 9)
    $combCount = comb($totalBalls, 9);
    // 计算 C(9, 2) × C(9, 3) × C(9, 4) x A(n, k)
    $comb9 = $combRed * $combYellow * $combBlue * $a;
    $result = sprintf("%.6f", $comb9 / $combCount * 100);
    echo "公式:C($redBalls, $red) * C($yellowBalls, $yellow) * C($blueBalls, $blue) * $AStr / C(27,9) \n";
    echo "值:$combRed * $combYellow * $combBlue * $a / $combCount \n";
    echo "该结果概率:$comb9 \n";
    echo "总概率:$combCount \n";

    // 输出结果
    echo "{$numValue}的概率为: " . $result . "%\n";

}

// 函数计算组合数 A(n, k)
function A($a,$b){
    // 函数计算排列数 A(n, k)
    function perm($n, $k) {
        // 计算 n 的阶乘
        $nFactorial = factorial($n);

        // 计算 (n - k) 的阶乘
        $kFactorial = factorial($n - $k);

        // 返回排列数 A(n, k)
        return intval($nFactorial / $kFactorial);
    }

// 辅助函数计算阶乘
    function factorial($n) {
        $result = 1;
        for ($i = 2; $i <= $n; $i++) {
            $result *= $i;
        }
        return $result;
    }

// 计算 A(3, 0)
    return perm($a, $b);
}

// 函数计算组合数 C(n, k)
function comb($n, $k) {
    // 计算组合数 C(n, k)
    $result = 1;
    for ($i = 0; $i < $k; $i++) {
        $result *= ($n - $i) / ($i + 1);
    }
    return intval($result);
}
//调用函数
XFGun(235);
运行结果

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

running245

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值