Рандом с вероятностью

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
Приветствую всех.
Имеется прототип кода:
g_iSpawnChance = RandomInt(0, 100);

Как написать функцию рандома с приортетом для переменной ?
К примеру при g_iSpawnChance = 100 - вероятность появления/использования/и т.д. 100% (то есть при проверке код сразу выполняется)
К примеру при g_iSpawnChance = 25 - вероятность появления/использования/и т.д. 25%
(то есть при проверке .... хз даже как описать :D)
Надеюсь поняли.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Посмотри код в gifts от R1KO, может найдешь то что тебе нужно.
[Gifts] Core
 

Vit_ amin

Добрая душа
Сообщения
1,525
Реакции
688
@Drumanid, Спасибо
--- Добавлено позже ---
PHP:
Math_GetRandomInt(min, max)
{
    new random = GetURandomInt();
    if (!random) random++;
    new number = RoundToCeil(float(random) / (float(2147483647) / float(max - min + 1))) + min - 1;
    return number;
}

Кто использует Gift, может скажет как работает данная функция ? (В плане чувствуется то, что рандом с приоритетом)
 
Последнее редактирование:

Kailo

Участник
Сообщения
194
Реакции
896
Сначала ответ на твою задачу.
Функция возвращает true с вероятность p.
PHP:
bool Chance(float p)
{
   return GetRandomFloat(0.0, 1.0) <= p;
}

// Пример
if (Chance(0.75))
{
    // Это условие выполняется с вероятностью 75%
}
else
{
    // Это условие выполняется с вероятностью 25%
}
Но есть в ней один нюанс:
Вероятности событий только примерно равны p и 1.0 - p.
1) Когда мы вводим 1.0, то функция должна всегда возвращать true, следовательно, ставим знак <=, но тогда при вероятности 0.0, при выпадании 0.0, она вернёт true, хотя по сути должна всегда false.
2) Обратная ошибка возникает если идти от обратного, что при вводе 0.0, всегда false. Должны поставить знак <, но тогда при вводе 1.0 при выпадании 1.0 вернёт false.
Выводы: Функция может быть записана как с условием <, так и <=, погрешность вероятности минимальна (0,00000005%); Так же не следует использовать значения 0.0 и 1.0.
P.S. По сути при знаке <=, и попытке получить 0.0, получается самая маленькая возможная вероятность (если не ошибся, то примерно 0,00000005%), аналогично при знаке < и 1.0 (вдруг захочется сделать так).
А так же можно поправить это доп условием (что не разумно, ИМХО).
PHP:
return p == 0.0 ? false : GetRandomFloat(0.0, 1.0) <= p;
// или
return p == 1.0 ? true : GetRandomFloat(0.0, 1.0) < p;

А теперь может будет интересно о Math_GetRandomInt.
Оффтоп
 
Последнее редактирование:
Сверху Снизу