[Разминка для мозгов]: взвешенный рандом
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Итак, задача написать функцию взвешенного рандома. То есть такого рандома, где частота выпадения элемента зависит от значения его веса.
Например, возьмем двумерный массив размером 4 x 2. Каждый подмассив описывает вес и значение в соответствующем порядке.
Необходимо написать функцию, которая будет принимать подобный массив и возвращать псевдослучайное значение, учитывая веса элементов.
На большом количестве вызовов функции распределение случайных значений (количество выпадений каждого из них) должно быть приближено к соотношению их весов.
Например, на 20000 вызовах функции с вышеприведенным массивом, число 1 выпадет примерно 2000 раз, число 2 — ~4000, число 3 — ~6000, а 4 — около 8000 раз.
Свои решения пишите прямо в этом топике.
Размер массива передаётся в функцию?
Не принципиально. Можно хоть
std::vector
передавать.Я тут написал, и в результате, результат в среднем колеблется от
-23 до +30
. Критично? Или так оставлять?Вот пример запуска:
С таким массивом весов и значений.
UPD на всякий случай убрал код
Код зря убрал, возвращай :)
Да, все верно. Берем рандом от суммы весов — и берем соответствующий сдвиг в исходном массиве.
Сколько времени ушло вывод на решение? :-)
3-6 мин
Мужик.
P.S. Если отвечаешь на предыдущий пост, то цитировать его целиком не нужно :)