Всем привет! Я делаю рулетку для одного учебного проекта. Так, вот у меня есть кейс с ценой в 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₽
Как мне найти связь между ценой предметов, ценой кейса и количеством предметов и правильно распределить шанс выпадения для каждого предмета? Я пытался играться с числами и составить какую-нибудь формулу, но у меня ничего не получается и я не знаю как это можно правильно посчитать, чтобы процент выпадения каждого предмета зависел от его цены и от цены кейса.
Есть кейс, при открывании которого случайно выпадает один из предметов 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) )
Если заранее заданы ценности предметов в кейсе, то цену кейса V
и вероятности выпадения предметов p_i
можно определить по формулам:
K = 1 / [(1/c1) + ... + (1/cN)]
V = N*K
p_i = K * (1/c_i)
Если же цена кейса 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) ) )
Возможно, стоит сделать, своего рода, "систему ценностей", то есть понять, сколько стоит дорогая вещи в эквиваленте дешёвой, сопоставить всё между собой, и запустить рандомайзей. Далее можно попробовать реализовать что-то такое:
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, ...}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Да, то, что я хочу, можно реализовать через return в функции, но меня волнует мой вопрос
Подскажите, пожалуйста как собрать все значения value в массив,для последующей работы с нимВот пробую написать
Задание "Описать класс, представляющий треугольникПредусмотреть методы для создания объектов, вычисления площади, периметра и точки пересечения...
Есть страница с блоками разных цветовЕсть меню, по клику на пункт которого, происходит прокрутка к соответствующему блоку