Hice esta función:
https://github.com/thewheelmaker/GDscript_Weighted_Random
Now! en tu caso puedes usarlo así:
on_normal_case([5,20,45,20,10],0)
Solo da un número entre 0 y 4, pero puede colocarlo en la matriz donde obtuvo los elementos.
item_array[on_normal_case([5,20,45,20,10],0)]
O en función:
item_function(on_normal_case([5,20,45,20,10],0))
Aquí está el código. Lo hice en GDscript, puedes, pero puede alterar otro idioma, también verifica si hay errores lógicos:
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 así: on_normal_case ([50,50], 0) Esto da 0 o 1, tiene la misma probabilidad de ambos.
on_normal_case ([50,50], 1) Esto da 1 o 2, tiene la misma probabilidad de ambos.
on_normal_case ([20,80], 1) Esto da 1 o 2, tiene un cambio mayor para obtener dos.
on_normal_case ([20,80,20,20,30], 1) Esto da un rango de números aleatorios 1-5 y los números más grandes son más probables que los números más pequeños.
on_normal_case ([20,80,0,0,20,20,30,0,0,0,0,33], 45) Este lanzamiento corta entre los números 45,46,49,50,51,56 que ves cuando hay es cero, nunca ocurre.
Por lo tanto, la función devuelve solo un número aleatorio que depende de la longitud de esa matriz de matriz y el número de transformm, y las entradas en la matriz son pesos de probabilidad de que un número pueda ocurrir, donde ese número es la ubicación en la matriz, más el número de transformm.