我有一场"战斗"系统,攻击者具有例如战斗力100,防守者具有例如75。
但我现在被困住了,我无法弄清楚如何找到胜利者。 我知道攻击者有25%的机会失去,但我无法想象这个剧本。
有什么想法吗?
答案 0 :(得分:16)
在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。
答案 1 :(得分:3)
玩家A对B获胜的机会是A /(A + B),这适用于任何数字和任何比例。然后使用动态的答案来计算实际结果。
对于你的例子:
$c = (75/(100+75)); // 0.42857142857142857143
$Awon = mt_rand(0, 9999) < ($c * 10000);
答案 2 :(得分:3)
如果我将其作为可用函数弹出代码:
function attack($attack, $defend)
{
return (mt_rand(1, $attack) > $defend);
}
$attack = 100;
$defend = 75;
var_dump(attack(100,75));
根据需要简单地返回true或false。传递你需要的任何值。
答案 3 :(得分:2)
使用随机数生成器,您可以创建一个函数,例如:
function chance($percent) {
return mt_rand(0, 99) < $percent;
}
然后你可以在任何地方使用该功能。注意:mt_rand
据称可以生成更好的随机数。