Я виконав цю функцію:
https://github.com/thewheelmaker/GDscript_Weighted_Random
Now! у вашому випадку ви можете використовувати його так:
on_normal_case([5,20,45,20,10],0)
Він дає лише число від 0 до 4, але ви можете помістити його в масив, де ви отримали предмети.
item_array[on_normal_case([5,20,45,20,10],0)]
Або у функції:
item_function(on_normal_case([5,20,45,20,10],0))
Ось код. Я зробив це на GDscript, ви можете, але це може змінити іншу мову, також перевірити логічні помилки:
func on_normal_case(arrayy,transformm):
var random_num=0
var sum=0
var summatut=0
#func sumarrays_inarray(array):
for i in range(arrayy.size()):
sum=sum+arrayy[i]
#func no_fixu_random_num(here_range,start_from):
random_num=randi()%sum+1
#Randomies be pressed down
#first start from zero
if 0<=random_num and random_num<=arrayy[0]:
#print(random_num)
#print(array[0])
return 0+ transformm
summatut=summatut+arrayy[0]
for i in range(arrayy.size()-1):
#they must pluss together
#if array[i]<=random_num and random_num<array[i+1]:
if summatut<random_num and random_num<=summatut+arrayy[i+1]:
#return i+1+transform
#print(random_num)
#print(summatut)
return i+1+ transformm
summatut=summatut+arrayy[i+1]
pass
Це працює так: on_normal_case ([50,50], 0) Це дає 0 або 1, він має однакову імовірність.
on_normal_case ([50,50], 1) Це дає 1 або 2, це однакова ймовірність і для обох.
on_normal_case ([20,80], 1) Це дає 1 або 2, він має більші зміни, щоб отримати два.
on_normal_case ([20,80,20,20,30], 1) Це дає діапазон випадкових чисел 1-5, і більші числа швидше, ніж менші числа.
on_normal_case ([20,80,0,0,20,20,30,0,0,0,0,33], 45) Цей кидок кісток між числами 45,46,49,50,51,56 ви бачите, коли є це нуль, воно ніколи не виникає.
Таким чином, функція повертає лише одне випадкове число, яке залежить від довжини цього масиву та номера трансформації, а входи в масиві - це ймовірнісні ваги, які може виникнути число, де це число є в масиві, плюс число трансформації.