У меня есть «боевая» система, у атакующего есть боевая сила, например, 100, защитник имеет силу, например, 75.
Но я застрял сейчас, я не могу понять, как найти победителя.
Я знаю, что у атакующего есть 25% шанс проиграть, но я не могу понять сценарий.
Есть идеи?
Извлечь случайное число между 0...100
или, если вы предпочитаете 0...1
,
Затем проверьте, меньше ли это число, чем 75. Если это так, то атакующий победил.
$p = rand(0,99);
if ($p<75)
// Attacker Won!
Это имеет очень прямолинейную вероятностную интерпретацию. если вы извлекаете случайным образом число между 0...100
у вас есть 75% шансов, что число будет ниже 75. Именно то, что вам нужно.
В этом случае вам просто нужно rand()
функция.
Также обратите внимание, что, согласно предложению @Marek, шанс победителя для атакующего может быть намного ниже, чем 75%. (прочитайте ответ Марека, который указывает на 57% шансов на победу).
Проблема возникнет, когда вам нужно смоделировать более сложную функцию плотности вероятности, например:
В этом случае вам понадобится более сложная модель, такая как Гауссова смесь.
Если бы я вставил это в код как полезную функцию:
function attack($attack, $defend)
{
return (mt_rand(1, $attack) > $defend);
}
$attack = 100;
$defend = 75;
var_dump(attack(100,75));
Просто вернет true или false, как требуется. Передайте те значения, которые вам нужны.
Вероятность выигрыша игрока A против B равна A / (A + B), это для любого числа и любого масштаба. Затем используйте динамический ответ, чтобы вычислить фактический результат.
Для вашего примера:
$c = (75/(100+75)); // 0.42857142857142857143
$Awon = mt_rand(0, 9999) < ($c * 10000);
Используя генератор случайных чисел, вы можете создать такую функцию, как:
function chance($percent) {
return mt_rand(0, 99) < $percent;
}
Тогда вы можете использовать функцию в любом месте. Замечания: mt_rand
предположительно генерирует лучшие случайные числа.