Tôi đã thực hiện chức năng này:
https://github.com/thewheelmaker/GDscript_ WEighted_Random
ngay! trong trường hợp của bạn, bạn có thể sử dụng nó như thế này:
on_normal_case([5,20,45,20,10],0)
Nó chỉ cung cấp một số từ 0 đến 4 nhưng bạn có thể đặt nó trong mảng nơi bạn có các mục.
item_array[on_normal_case([5,20,45,20,10],0)]
Hoặc trong chức năng:
item_function(on_normal_case([5,20,45,20,10],0))
Đây là mã. Tôi đã làm nó trên GDscript, bạn có thể, nhưng nó có thể thay đổi ngôn ngữ khác, cũng kiểm tra lỗi logic:
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
Nó hoạt động như thế này: on_n normal_case ([50,50], 0) Điều này cho 0 hoặc 1, nó có cùng xác suất cả hai.
on_n normal_case ([50,50], 1) Điều này cho 1 hoặc 2, nó có cùng xác suất cả hai.
on_n normal_case ([20,80], 1) Điều này mang lại 1 hoặc 2, nó có thay đổi lớn hơn để có được hai.
on_n normal_case ([20,80,20,20,30], 1) Điều này cho các số ngẫu nhiên nằm trong phạm vi 1-5 và các số lớn hơn có nhiều khả năng hơn các số nhỏ hơn.
on_n normal_case ([20,80,0,0,20,20,30,0,0,0,0,33], 45) Trò chơi ném xúc xắc này giữa các số 45,46,49,50,51,56 bạn thấy khi ở đó bằng không nó không bao giờ xảy ra.
Vì vậy, hàm này chỉ trả về một số ngẫu nhiên phụ thuộc vào chiều dài của mảng và số biến đổi đó, và số nguyên trong mảng là các trọng số xác suất mà một số có thể xảy ra, trong đó số đó là vị trí trên mảng, số biến đổi kìm.