Генерация случайных элементов в массиве на php учитывая стоимость кейса и стоимость предмета

Ссылка на оригинал

Как превратить этот код

$case_cost = 39;

$list_skins = [
    $skin_1 = ['GLOVES/Champion.webp', 'GLOVES', 'Champion', 'gradient_gold', 1899],
    $skin_2 = ['GLOVES/Burning_Fists.webp', 'GLOVES', 'Burning Fists', 'gradient_gold', 2100],
    $skin_3 = ['GLOVES/Steam_Rider.webp', 'GLOVES', 'Steam Rider', 'gradient_gold', 1400],
    $skin_4 = ['GLOVES/Punk.webp', 'GLOVES', 'Punk', 'gradient_gold', 2887],
    $skin_5 = ['AWM/BOOM.webp', 'AWM', 'BOOM', 'gradient_arcane', 200],
    $skin_6 = ['M4A1/Bubblegum.webp', 'M4A1', 'Bubblegum', 'gradient_arcane', 249],
    $skin_7 = ['USP/Chameleon.webp', 'USP', 'Chameleon', 'gradient_legendary', 23],
    $skin_8 = ['Desert_Eagle/Orochi.webp', 'Desert Eagle', 'Orochi', 'gradient_legendary', 21],
    $skin_9 = ['M60/Grunge.webp', 'M60', 'Grunge', 'gradient_legendary', 20],
    $skin_10 = ['Famas/Anger.webp', 'Famas', 'Anger', 'gradient_epic', 3],
    $skin_11 = ['M60/Steam_Beast.webp', 'M60', 'Steam Beast', 'gradient_epic', 2.90],
    $skin_12 = ['MP7/Palace.webp', 'MP7', 'Palace', 'gradient_epic', 2.70],
    $skin_13 = ['P350/Oni.webp', 'P350', 'Oni', 'gradient_rare', 0.56],
    $skin_14 = ['M4/Demon.webp', 'M4', 'Demon', 'gradient_rare', 0.55],
    $skin_15 = ['M4A1/Kitsune.webp', 'M4A1', 'Kitsune', 'gradient_rare', 0.65],
    $skin_16 = ['TEC9/Tropic.webp', 'TEC9', 'Tropic', 'gradient_rare', 0.52],
    $skin_17 = ['AKR/Scale.webp', 'AKR', 'Scale', 'gradient_uncommon', 0.17],
    $skin_18 = ['AWM/Elevation.webp', 'AWM', 'Elevation', 'gradient_uncommon', 0.24],
    $skin_19 = ['SM1014/Tropic.webp', 'SM1014', 'Tropic', 'gradient_uncommon', 0.10],
    $skin_20 = ['UMP45/Peaceful.webp', 'UMP45', 'Peaceful', 'gradient_uncommon', 0.11],
    $skin_21 = ['AKR12/Roar.webp', 'AKR12', 'Roar', 'gradient_common', 0.05],
    $skin_22 = ['G22/Scale.webp', 'G22', 'Scale', 'gradient_common', 0.07],
];

$num_items = count($list_skins);
for ($cycle = 0; $cycle < count($list_skins); $cycle++) {
    $num_items;
    
}

в случайную генерацию элементов из этого массива с помощью этих скриншотов


Ответы (1 шт):

Автор решения: Егор Банин

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

Итак:

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

Как решить такую задачу? По моему опыту, для решения задач надо подумать. Подумать помогают рисунки, примеры и аналогии. Давайте нарисуем цены сундука и предметов на числовой оси:

---0---1---2---3---4---5---6---7---
       |       |       |       |
       ?      ?️      ?      ?

Теперь разница между ценой сундука и ценой предмета очень наглядна. То что ближе к сундуку, выпадет с большей вероятностью. Сумма этих вероятностей должна быть равна 1 (100%) -- что-нибудь обязательно выпадет. Тут простая арифметика:

   ?                       1
--------- = ---------------------------------
1/(5 - 1)   1/(5 - 1) + 1/(5 - 3) + 1/(7 - 5)

? = 1/5
?️ = 2/5
? = 2/5

Осталось выбрать предмет броском кубика. Снова порисуем:

---0---0.2-----------0.6-----------1---
   |    |             |            |
   ?????️?️?️?️?️?️?️?️????????

То есть мы бросаем кубик с от 0 до 1 рациональными гранями (это воображаемый кубик, поэтому у него может быть любое удобное нам количество граней :-). Если выпадет до 0.2 -- из сундука выпадет ?, 0.2-0.6 -- ?️, 0.6-1 -- ?.

→ Ссылка