GM2 7.5: Проверяем работу рандома

Ссылка на первую статью 2-го сезона полного провала разработки.

Сделала небольшой проектик для проверки распределения рандома в движке Game Maker 8 старой версии. Написала простенький код, который кидает рандом и заполняет одну из 6 переменных-счетчиков. За одно нажатие кнопки проходит 100 виртуальных бросков кубика.

У меня было подозрение, что использование функции рандома внутри цикла FOR может иметь перекос из-за малого промежутка времени между вызовами.

Написала такой код
Написала такой код
Получила такой результат

Виден явный перекос в результатах. На всякий случай сократила число бросков за раз до 1 и нашла проблему.

Добавила брейки
Добавила брейки
И такой вышел итог после многократного нажатия
И такой вышел итог после многократного нажатия

Может, это я ступила, но почему-то кейсы срабатывают многократно, даже если не соответствуют условиям. Это проблема самого оператора или конкретно движка? Пока не знаю, но нужно будет это учитывать в будущем.

В проекте уже был один такой момент, когда я не понимала, что происходит с перепрыгиванием кейсов и добавила костыль. Но по итогу выходит, что рандом в движке работает адекватно и переживать не за что.

77
11
15 комментариев

А у тебя randomize() прописано где-нибудь в приложении?

Вообще, для "нормального" рандома часто создают массив и вычитают из него ячейки. Некоторые нужные комбинации можно записать большее количество раз, некоторые подсовывать раньше. Короче, гадко читерить.

И переходи уже на GMS, ей богу

1

Нет, это встроенная в движок функция.

Про массив не поняла, это уже что-то на сложном.

Не перейду, пока не доведу до ума хотя бы один проект)

1

но почему-то кейсы срабатывают многократно, даже если не соответствуют условиямстранно, а у меня бы всё точно заработало.

1

профессионала сразу видно)

1

Так не во всех языках, но во многих.
В go например наоборот надо делать fallthrough, если хочешь, чтобы выполнилось ниже.

1

Ага, нужно учитывать подобное на будущее.

1

Вот как выглядела генерация рандома в DOOM
Вместо того что бы забивать себе голову генераторами чисел они сделали себе таблицу по которой шли последовательно.

На самом деле вопрос "рандома" это интересный вопрос который тысячи геймдизайнеров не могут решить.
Обычно для генерации рандома используют функцию тайм, которая образует стартовое зерно , и берут модуль от магического числа которое прописано в функции Rand стандартной библиотеки Си.

Прикол рандома - что чистый рандом - НИКОГДА не воспринимается игроком как "ЧЕСТНЫЙ"
Гораздо лучше использовать рандом с подкруткой.
пример такого рандома был в играх Ричарда Гэрриота каждый промах - увеличивал базовый шанс крита на 5% . Пока он не достигал 100% После чего система сбрасывалась.

Другой вариант - честного рандма - это Лотто- выборкой: где мы воспринимаем цифры рандома не как броски - а как доставание из мешка лотто циферок.

Например 6 гранный кубик.
дает значения 1 2 3 4 5 6
При первом выбрасывании: будет условно говоря 3.
То следующее число будет из выбора 1 2 4 5 6
Потом выкидывем 6
и у нас остается 1 2 4 5
Потом осталось выкинуть 4 оставшиеся цифры и цикл сбрасывается.
Это будет восприниматься гораздо честнее.

Но у такой лотто выборки могут быть сложности с генерацией выигрышных бросков.
но тут это можно решить вопросом дублирования диапозона.
11 22 33 44 55 66
или 111 222 333 444 555 666 и так далее. Но больше 3-4х дублей не рекомендую.

Еще у Лотто выборки можно считерить и сделать множители сложности игры.
Например : таблицу бросков :
Для легкого уровня: 1 2 33 444 55 6
Для среднего 1 2 33 44 5 6
для высокого : 1 2 3 4 5 6
Для хардкора 11 222 33 4 5 6

1