【问题标题】:Chance of winning PHP percent calculation赢得 PHP 百分比计算的机会
【发布时间】:2015-03-05 13:51:58
【问题描述】:

我有一个“战斗”系统,攻击者的战斗力例如100,防守者的力量例如75.

但我现在卡住了,我不知道如何找到获胜者。 我知道攻击者有 25% 的机会失败,但我不知道脚本。

有什么想法吗?

【问题讨论】:

  • php.net/manual/en/function.rand.php 可能会在这里为您提供帮助。
  • 只是出于好奇:如果进攻方和防守方的力量都为 100,会发生什么? (或者这是否以某种方式被禁止?)

标签: php random probability


【解决方案1】:

提取0...100之间的随机数,或者如果您更喜欢0...1
比检查这个数字是否低于 75。如果是,那么攻击者就赢了。

$p = rand(0,99);
if ($p<75)
  // Attacker Won!

这有一个非常严格的概率解释。如果您随机抽取0...100 之间的数字,则该数字有 75% 的机会低于 75。这正是您所需要的。

在这种情况下,您只需要rand() 函数。 还要注意@Marek 的建议,攻击者的获胜机会可能远低于 75%。 (阅读 Marek 的回答,指出获胜的可能性为 57%)。

当你需要对更复杂的概率密度函数建模时就会出现问题,例如:

在这种情况下,您将需要一个更复杂的模型,例如 gaussian mixture

【讨论】:

  • 当然,我想的方法很复杂,但它就是这么简单。干得好,谢谢!
  • 您应该检查@Marek 的答案。在这里,较弱的防守者有 75% 的获胜机会。这绝对是错误的。
  • 确定我已经反转了攻击者/防御者,修复了它
  • 即使切换它们,数字(25% 对 75%)也是错误的。
  • 我已编辑以警告 OP 他可能使用了错误的相对百分比,但宣布获胜者的方法仍然有效
【解决方案2】:

使用随机数生成器,可以创建如下函数:

function chance($percent) {
  return mt_rand(0, 99) < $percent;
}

然后您可以在任何地方使用该功能。注意:mt_rand 应该会生成更好的随机数。

【讨论】:

    【解决方案3】:

    如果我把它作为一个可用的函数放入代码中:

    function attack($attack, $defend)
    {
        return (mt_rand(1, $attack) > $defend);
    }
    
    $attack = 100;
    $defend = 75;
    
    var_dump(attack(100,75));
    

    将根据需要简单地返回 true 或 false。传递您需要的任何值。

    【讨论】:

      【解决方案4】:

      玩家 A 对 B 获胜的机会是 A/(A+B),这适用于任何数字和任何规模。然后使用动态的答案来计算实际结果。

      你的例子:

      $c = (75/(100+75)); // 0.42857142857142857143
      $Awon = mt_rand(0, 9999) < ($c * 10000);
      

      【讨论】:

      • 就数学而言,这似乎是唯一正确的答案。
      • 不对,玩家 A 有 75% 的获胜机会,100/(100 + 75) = 0.57,即 57%。
      • @Styphon 那是 75 分,不是百分比。游戏总分175分,玩家A有75分。
      • @Marek,根据OP,没有A有100分,B有75分。
      • @jeroen 您假设该操作基于两个用户可用积分的总获胜百分比。虽然我同意,这可能是 OP 最初的意图和想要的,但现在是他所要求的。我们从 OP 的原始声明中只知道 A 有 25% 的机会失败。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多