random — вероятность выигрыша в процентах от PHP

У меня есть «боевая» система, у атакующего есть боевая сила, например, 100, защитник имеет силу, например, 75.

Но я застрял сейчас, я не могу понять, как найти победителя.
Я знаю, что у атакующего есть 25% шанс проиграть, но я не могу понять сценарий.

Есть идеи?

8

Решение

Извлечь случайное число между 0...100или, если вы предпочитаете 0...1,
Затем проверьте, меньше ли это число, чем 75. Если это так, то атакующий победил.

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

Это имеет очень прямолинейную вероятностную интерпретацию. если вы извлекаете случайным образом число между 0...100 у вас есть 75% шансов, что число будет ниже 75. Именно то, что вам нужно.

В этом случае вам просто нужно rand() функция.
Также обратите внимание, что, согласно предложению @Marek, шанс победителя для атакующего может быть намного ниже, чем 75%. (прочитайте ответ Марека, который указывает на 57% шансов на победу).

Проблема возникнет, когда вам нужно смоделировать более сложную функцию плотности вероятности, например:

введите описание изображения здесь

В этом случае вам понадобится более сложная модель, такая как Гауссова смесь.

16

Другие решения

Если бы я вставил это в код как полезную функцию:

function attack($attack, $defend)
{
return (mt_rand(1, $attack) > $defend);
}

$attack = 100;
$defend = 75;

var_dump(attack(100,75));

Просто вернет true или false, как требуется. Передайте те значения, которые вам нужны.

3

Вероятность выигрыша игрока A против B равна A / (A + B), это для любого числа и любого масштаба. Затем используйте динамический ответ, чтобы вычислить фактический результат.

Для вашего примера:

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

Используя генератор случайных чисел, вы можете создать такую ​​функцию, как:

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

Тогда вы можете использовать функцию в любом месте. Замечания: mt_rand предположительно генерирует лучшие случайные числа.

2
По вопросам рекламы [email protected]