Преобразования числа в шанс выподения значения
Как сделать из этих случайных чисел:
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));