Godot 3.3.3
GDScript 1.0
對每個值賦予一個機率,然後根據機率擷取每個值
以下為 Godot 3.3.3 編輯器下的代碼,其他語言稍加修改即可
tool
extends EditorScript
# 執行代碼
func _run() -> void:
# 讓每次執行的随機都不同
randomize()
var value_list = [1, 2, 3, 4, 5]
var probability_list = [0.5, 0.3, 0.7, 0.1, 0.3]
# 存到字典中,計算對應 value 出現的次數
var data = {}
for value in value_list:
data[value] = 0
# 循環擷取 50 次
var value = 0
for i in range(0, 50):
value = _get_value(value_list, probability_list)
data[value] += 1
# 格式化輸出 資料
print(JSON.print(data, "\t"))
## 傳回對應機率的值
## @value_list 值清單
## @probability_list 機率清單
func _get_value(
value_list : Array,
probability_list: Array
):
# 兩個清單的值的個數應相同
if value_list.size() != probability_list.size():
print("數量不一緻")
return null
# 累加機率值,計算機率總和
# 每次累加存到清單中作為機率區間
var sum = 0.0
var p_list = [] # 機率清單
for i in probability_list:
sum += i
p_list.push_back(sum)
# 産生一個 [0, 機率總和) 之間的随機值
# 機率區間越大的值,則随機到的機率越大
# 則就實作了每個值的随機值
var r = randf() * sum
var idx = 0
for p in p_list:
# 目前機率超過或等于随機的機率,則傳回
if p >= r:
return value_list[idx]
idx += 1
return null
按 Ctrl+Shift+X 執行代碼,或菜單執行
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwkEVPd3Zq10MNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL0QmMmhzNwETNmFDZ5AjY4YjMlRjNkVWNiBjNmFjM3kzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
執行了 4 次後的輸出結果:
可以看到 3 的機率最大,之後是 1