Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Генератор случайных чисел

JadgTiger Просветленный (23747), закрыт 17 лет назад
Я 4ый год в качестве хобби пишу собственную игрушку. Это стратегия. Пишу для себя, потому что касается ее сути - без комментариев. Совсем недавно, наконец-то дошел до момента реализации боя между юнитами. Т.к. это все еще пока просто тесты бой проходит в режиме 1 на 1, и все процессы в нем СЛУЧАЙНЫЕ. Т.е. используется генератор случайных чисел, и для вероятности атаки (кто будет атаковать), и для уровня повреждений (насколько сильно будет поврежден атакуемый юнит). На этом этапе я тестирую примитивную графику. И вот, что я заметил: Два абсолютно одинаковых юнита (легкая пехота, предположим), будучи абсолютно в равных условиях, сражающиеся исключительно на случайных процессах ведут себя почему-то в общем и целом закономерно. Чем объяснить подобную несправедливость?

Ошибка в алгоритме боя исключена, т.к. трассировка десятки раз доказывает обратное. Получается, что в 5 из 10 боев одна сторона в среднем должна брать верх. Экспериментов было уже за тысячу, компьютер не переставал решать эту задачу полтора месяца подряд. Но 50 на 50 не получается, получается 40 на 60.

А весь вопрос заключается в том, как работает генератор случайных чисел (ГСЧ) Т.е. не как он используется, в языках программирования, а каким образом компьютер может выбрать случайное число, на основании каких условий? Понятно, что функция random(X) возращает значение в диапазоне [0..Х-1], но по каким критериям она выбирает Х, кто-нибудь знает?
Дополнен 17 лет назад
P.S. Х - формальная переменная, как присваивается ей значение, в этой (или аналогичной по сути) функции?
Лучший ответ
Alexey Veselkin Гуру (4385) 17 лет назад
о-ё. Помнится на VB всегда писал Randomize Timer, чтобы рандомизировать по случайному отрезку времени (эээ, кажется) =) Также помню, что БЕЗ него после нового запуска програмы random выдавал одни и те_же значения, т.е. после перезапуска - теже чила (повторюсь, без Randomize Timer).

50 на 50 не получится - на то он и рандом. Есть теория вероятности, ее проходят в вузах =)) (школах?) Может быть источником для размышлений.
Остальные ответы
WereWolf Мудрец (15055) 17 лет назад
При этом X не равен ни нулю, ни единице. Там связь со временем, точнее сейчас не скажу - не помню. В общем, от даты до секунд...
Владимир Волков Мыслитель (8150) 17 лет назад
При постановке эксперимента функцией random() не пользуются.
А пишется отдельная функция-генератор. В нем и реализуш требуемый закон распределения(exp, lg,
и пр.)
Al T Просветленный (21429) 17 лет назад
Random без параметров возвращает дробь от 0 до 1, с параметром - целое от 0 до параметра-1. Так в паскале, по крайней мере. Вообще эту функцию уже тестировали, она не совсем случайные числа возвращает (так писали, я не проверял). Слабо написать свой генератор?
Питерский Гуру (4078) 17 лет назад
Генератор не отдает случайные числа. Все возвращаемые им числа - закономерны. Чтоб на выходе числа выглядели случайными, нужно привязать каждую генерацию ко времени. Так проще.
Похожие вопросы