Слово рандом в переводе с английского означает случайный. Пример: «рандомом выбрали людей из группы и отправили убираться» (у нас так тоже бывает). Изначально это слово употребляли контристы. Рандом на их сленге означал случайное попадание в голову с летальным исходом. Но мы не контристы и в наших головах уже не по одной и даже не по одному десятку дыр на этом проекте. Я покопался в литературе и попытался все же взглянуть на рандом как на материальный объект, а не божество. Вот что получилось.
Пример частный и к нашему проекту отношения не имеет; я надеюсь; поскольку рандом должен быть одинаков для всех…
Функция Randomize, она же Random, она же Rnd выдает нам случайное число от которого мы уже пляшем в соответствии с нашими потребностями.
Для самого простого примера возьмем генерацию равновероятных событий (да\нет, 0\1 и т.д.). По сути нам случайным образом надо выбрать одно из двух. На самом лучшем языке на свете (кто будет спорить, тот проклятым идет в лес) это будет выглядеть так :
Dim proba As Integer
proba = CInt(Int((2 * Rnd()) + 1))
' упрощенный вариант
proba = 2 * Rnd() + 1 ' и отбрасываем дробную часть
Значения функции Rnd() всегда лежат в диапазоне 0 <= Rnd() < 1, поэтому какие бы нам значения не выдавала функция в вышеуказанном примере всегда на выходе (proba) будем получать 1 или 2. Ну а дальше напишем небольшое условие по которому, если proba=1, то делаем хорошее действие Schastie() (например побеждаем в матче), если 2, то плохое Beda() (проигрываем) :
If proba = 1 Then Schastie() Else Beda()
В этом примере, если мы про победу заговорили, у нас шансы 50\50 на при равном сопернике. Усложним пример. Заставим результат зависеть от уровня играющих команд. Переменная level будет нам сообщать на сколько велика разница в классе, код будет уже такой:
Dim proba As Integer
proba = CInt(Int((level * Rnd()) + 1))
' упрощенный вариант
proba = level * Rnd() + 1 ' и отбрасываем дробную часть
If proba = 1 Then Schastie() Else Beda()
Тут на выходе мы получаем, если наша команда на +1 (level=1), то proba у нас всегда = 1 и соответственно всегда выполняется Schastie().
Eсли наша команда на +5 (level=5), то proba у нас будет равна 1,2,3,4 или 5, а Schastie() выполняется только если proba=1, соответственно шанс равен 20%.
Если наша команда на +9 (level=9), то proba у нас будет равна 1,2,3 ... 8,9, а Schastie().выполняется все также если proba=1.
Смышленый читатель сможет сам высчитать шанс благосклонности рандома.
Все это легко и просто, но не интересно. Тут явно не хватает «Бабушки». Попросим бабушку прийти. Введем повышающие и понижающие коэффициенты для бабушкиного настроения:
Отличное настроение = 0.5
Чуть лучше чем обычно = 0.75
Обычное настроение = 1
Бабушка хмурится = 2
Бабушка в печали = 4
Кто сожрал варенье = 10
Теперь код у нас будет выглядеть так :
Dim proba As Integer
proba = CInt(Int((level * babushka * Rnd()) + 1))
' упрощенный вариант
proba = level * babushka * Rnd() + 1 ' и отбрасываем дробную часть
If proba = 1 Then Schastie() Else Beda()
Юные математики уже в уме сосчитали, для оболтусов дадим правильные ответы в процентах на успех на +5 (середина) :
Отличное настроение = 40%
Чуть лучше чем обычно = 30%
Обычное настроение = 20%
Бабушка хмурится = 10%
Бабушка в печали = 5%
Кто сожрал варенье = 2%
Сразу скажу, что в половине того, что написал, мог все перепутать, не спец, но это не главное, задача статьи донести, что рандом в игре не божество, а формулы либо программный сбой.
Всем удачи и любите бабушку.