Случайный сундук, поиск параметров

193
08 декабря 2021, 17:10

Всем привет! Я делаю рулетку для одного учебного проекта. Так, вот у меня есть кейс с ценой в 59₽, в нём расположены предметы:

1 — 10₽ 
2 — 30₽
3 — 50₽
4 — 60₽
5 — 80₽
6 — 100₽
7 — 140₽
8 — 200₽
9 — 250₽
10 — 400₽
11 — 600₽
12 — 1000₽
13 — 1500₽
14 — 2500₽ 

Как мне найти связь между ценой предметов, ценой кейса и количеством предметов и правильно распределить шанс выпадения для каждого предмета? Я пытался играться с числами и составить какую-нибудь формулу, но у меня ничего не получается и я не знаю как это можно правильно посчитать, чтобы процент выпадения каждого предмета зависел от его цены и от цены кейса.

Answer 1

Анализ задачи с точки зрения теории вероятностей.

Есть кейс, при открывании которого случайно выпадает один из предметов 1..N (в вашем случае N = 14). Обозначим цены предмета c1, ... , cN, обозначим вероятности выпадения p1, ... , pN, p1 + ... + pN = 1.

Стоимости предметов ck известны, нужно найти вероятности pk (при заданной общей стоимости кейса, обозначим это стоимость через V).

Посчитаем математическое ожидание цены предмета, который мы достаём из кейса, это легко:

EV := E{cost} = p1*c1 + ... + pN*cN

Нам нужно, чтобы математическое ожидание цены не превышало цены кейса (иначе в среднем игрок с открытия кейсов получит больше, чем заплатил за них, что невыгодно для игры). Отсюда получаем условие:

EV <= V

Будем считать, что мы честные, и поставим выше равенство, то есть это будет означать, что игра не имеет ни прибыли, ни убытков от продаже кейсов (если вы хотите, после расчётов вы можете взять цену V больше расчётной, и игра будет иметь прибыль, или же меньше, тогда игроки будут иметь прибыль).

Мы имеем уравнение:

V = p1*c1 + ... + pN*cN

Оно не имеет однозначного решения. Поэтому добавим дополнительные требования. Допустим, у нас 2 предмета, один в 2 раза дороже другого, тогда было бы логично, если бы более дорогой выпадал бы в 2 раза реже того, что дешевле, то есть дешёвый должен выпадат с вероятностью 2/3, а дорогой с вероятностью 1/3. Отсюда логично напрашивается вывод, что вероятности должны быть обратно пропорциональны ценности предметов:

p_i = K * (1/c_i)

Добавляем условие нормировки вероятностей:

1 = p1 + ... + pN = K * [(1/c1) + ... + (1/cN)]

откуда:

K = 1 / [(1/c1) + ... + (1/cN)]

среднее гармоническое цен предметов.

Заметим, что эти условия уже полностью определили вероятности, и из уравнения выше мы можем вычислить значение цены кейса V, которую необходимо назначить, чтобы не было ни прибыли, ни убытков. Это означает, что заранее выбрать цену V вообще говоря нельзя.

Решить эту проблему можно частично, если добавить ещё выпадение предмета нулевой ценности, с вероятностью p0 и ценой c0 = 0, тогда коэффициент K определяется из уравнение совпадения математического ожидания цены кейса с реальной ценой V = EV:

V = p1*c1 + ... + pN*cN
V = K*N
K = V/N

Теперь суммируем вероятности p_i = K*(1/c_i) = V/(N*c_i):

p1 + ... + pN = (V/N) * ( (1/c1) + ... + (1/cN) )

и эта сумма должна не превышать единицы, чтобы можно было дополнить её неотрицательной вероятностью `p0, которая будет отвечать за выпадения условного игрового мусора, то есть:

(V/N) * ( (1/c1) + ... + (1/cN) ) < 1

откуда получаем ограничение на допустимую заранее назначенную цену кейса V:

V <= N * (1 / ( (1/c1) + ... + (1/cN) ) )

и тогда

p0 = 1 - (V/N) * ( (1/c1) + ... + (1/cN) )

Выводы и формулы.

  1. Если заранее заданы ценности предметов в кейсе, то цену кейса V и вероятности выпадения предметов p_i можно определить по формулам:

    K   = 1 / [(1/c1) + ... + (1/cN)]
    V   = N*K
    p_i = K * (1/c_i)
    
  2. Если же цена кейса V задана заранее, то следует ввести вероятность p0 выпадение предмета, не представляющего игровой ценности, и вероятности будут определяться по следующим формулам:

    K   = V/N
    p_i = K * (1/c_i)
    p0  = 1 - (V/N) * ( (1/c1) + ... + (1/cN) )
    

    и возможно это лишь при условии выполненного неравенства:

    V <= N * (1 / ( (1/c1) + ... + (1/cN) ) )
    
Answer 2

Возможно, стоит сделать, своего рода, "систему ценностей", то есть понять, сколько стоит дорогая вещи в эквиваленте дешёвой, сопоставить всё между собой, и запустить рандомайзей. Далее можно попробовать реализовать что-то такое:

import random
  #Тут я просто написал рандомные числа, 
  #вам придётся самому просчитывать нужный шанс выпадения:
  #специальным алгоритмом, или "на бумажке" 
Variant = [50, 90, 120, 140, 150, 155, ...] 
a = random.randint(1, 150)
for i in range(len(Variant)):
    if a <= Variant[i]:
        print('Вам выпал предмет:' + str(i + 1))
        break

Правда, список можно будет заменить на словарь ( {1: 50, 2: 90, ...}

READ ALSO
Почему массив не изменяется?

Почему массив не изменяется?

Да, то, что я хочу, можно реализовать через return в функции, но меня волнует мой вопрос

227
JS Получить все значения value в массив

JS Получить все значения value в массив

Подскажите, пожалуйста как собрать все значения value в массив,для последующей работы с нимВот пробую написать

160
Как мне использоваться переменную из одного метода в другом

Как мне использоваться переменную из одного метода в другом

Задание "Описать класс, представляющий треугольникПредусмотреть методы для создания объектов, вычисления площади, периметра и точки пересечения...

122
Изменение цвета шапки меню при прокрутке к блоку с таким же цветом

Изменение цвета шапки меню при прокрутке к блоку с таким же цветом

Есть страница с блоками разных цветовЕсть меню, по клику на пункт которого, происходит прокрутка к соответствующему блоку

229