@br1an

Как выбрать случайным образом победителя, учитывая его шанс на победу?

Добрый день, уважаемые :)
Есть такая задача:
Люди делают ставки предметами (предметы оцениваются по цене, цена как правило дробное число = 0.55, 34.22 и т.д), через какое-то время должен выбраться победитель случайным образом, НО с учетом того шанса на победу (чем больше ставка - тем больше шанс победить).
Примеры таких сайтов - csgojackpot.com, csgoup.ru
Мы реализовали данный алгоритм вот так https://gist.github.com/Riateche/3038910
Но есть сомнения, т.к очень и очень часто выигрывают люди с небольшим шансом (можно конечно оправдать, что мол рандом)
Подскажите пожалуйста, правильный ли алгоритм мы используем (учитывая что число случайное - целое, а отрезки шансов в алгоритме - дробные)? И есть ли более подходящие системы случайного выбора победителя, основанные на шансе победы?
  • Вопрос задан
  • 1155 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Это классический алгоритм. Визуально его можно представить так:
- Каждая ставка представляется в виде отрезка с длиной, равной ставке.
- Эти отрезки располагаются на прямой друг за другом без разрывов.
- На полученный отрезок, равный по длине сумме всех ставок, равновероятно бросается точка.
- Побеждает та ставка, на отрезок которой эта точка попала.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Mrrl
@Mrrl
Заводчик кардиганов
Лучше брать дробное случайное число:
double r=frand()*total_chance_sum.
(как сегодня называется frand() я не знаю - должно выдавать случайное число от 0 до 1). Условие current_sum <= r не нужно, оно выполняется всегда.
Если хотите повысить шансы тех, кто делал большие ставки - можете возвести эти ставки в квадрат (т.е. если цены - 0.5, 1, 2, то шансы на победу будут 1/21, 4/21, 16/21). Не знаю, хорошо ли это.

Вообще, не очень понятно, как работает
current_sum += items[i].chance
если сумма целая, а ставка дробная. Она не ругается на потерю точности?
Ответ написан
TwerTrue
@TwerTrue
Молодой и неопытный разработчик
Ну первое чтобы сделал я, это просто собрал бы статистику побед за недели к примеру и потом бы судил работает алгоритм нормально или нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы