天天看點

【算法】根據每個值的機率傳回對應值

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 執行代碼,或菜單執行

【算法】根據每個值的機率傳回對應值

執行了 4 次後的輸出結果:

【算法】根據每個值的機率傳回對應值

可以看到 3 的機率最大,之後是 1

繼續閱讀