Eu fiz esta função:
https://github.com/thewheelmaker/GDscript_Weighted_Random
Now! no seu caso, você pode usá-lo assim:
on_normal_case([5,20,45,20,10],0)
Ele fornece apenas um número entre 0 e 4, mas você pode colocá-lo na matriz onde obteve os itens.
item_array[on_normal_case([5,20,45,20,10],0)]
Ou em função:
item_function(on_normal_case([5,20,45,20,10],0))
Aqui está o código. Eu fiz isso no GDscript, você pode, mas pode alterar outro idioma, também verificar erros de lógica:
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
Funciona assim: on_normal_case ([50,50], 0) Isso fornece 0 ou 1, tem a mesma probabilidade ambos.
on_normal_case ([50,50], 1) Isso fornece 1 ou 2, tem a mesma probabilidade ambos.
on_normal_case ([20,80], 1) Isso fornece 1 ou 2, pois possui maiores alterações para obter dois.
on_normal_case ([20,80,20,20,30], 1) Isso fornece números aleatórios entre 1 e 5 e números maiores são mais prováveis que números menores.
on_normal_case ([20,80,0,0,20,20,30,0,0,0,33], 45) Esse lançamento corta entre os números 45,46,49,50,51,56 que você vê quando há é zero, nunca ocorre.
Portanto, sua função retorna apenas um número aleatório que depende do comprimento dessa matriz e do número de transformadores, e as ints na matriz são pesos de probabilidade que um número pode ocorrer, onde esse número está localizado na matriz, pluss transformm number.