Преобразования числа в шанс выподения значения

Как сделать из этих случайных чисел:

0.00093350567284217
0.00084415584415584
0.0012662337662338
0.00061403784992285
0.0088636363636364
0.0071193866374589
0.077075098814229
0.084415584415584
0.088636363636364
0.59090909090909
0.61128526645768
0.65656565656566
3.1655844155844
3.2231404958678
2.7272727272727
3.4090909090909
10.427807486631
7.3863636363636
17.727272727273
16.115702479339
35.454545454545
25.324675324675

или

$chance0 = 0.00093350567284217
$chance1 = 0.00084415584415584
$chance2 = 0.0012662337662338
$chance3 = 0.00061403784992285
$chance4 = 0.0088636363636364
$chance5 = 0.0071193866374589
$chance6 = 0.077075098814229
$chance7 = 0.084415584415584
$chance8 = 0.088636363636364
$chance9 = 0.59090909090909
$chance10 = 0.61128526645768
$chance11 = 0.65656565656566
$chance12 = 3.1655844155844
$chance13 = 3.2231404958678
$chance14 = 2.7272727272727
$chance15 = 3.4090909090909
$chance16 = 10.427807486631
$chance17 = 7.3863636363636
$chance18 = 17.727272727273
$chance19 = 16.115702479339
$chance20 = 35.454545454545
$chance21 = 25.324675324675

В случайное шанс выпадения из массива согласно этим числам? Если кого то интересует код:

$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++) {
    print_r(($case_cost / $num_items) * (1 / $list_skins[$cycle][4]));
    print '<br>';
}

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

Автор решения: Льоха

Думаю, это неплохое решение вашей проблемы. Сначала нужно посчитать сумму всех шансов, потом сгенерировать число в этом диапазоне и, расcделяя сумму шансов на секторы, сравнивать со случайным числом:

<?php

$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]
];

$allChances = 0.0;

foreach ($list_skins as &$value) {
    $allChances += end($value);
}


function choiceByChance($all, $skins){
    $chance = (rand() / getrandmax()) * $all;
    foreach ($skins as &$value){
        $all -= end($value);
        if ($chance >= $all) {
            return $value;
        }
    }   
}

var_dump(choiceByChance($allChances, $list_skins));
→ Ссылка