算法根据每个值的概率返回对应值
Posted 张学徒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法根据每个值的概率返回对应值相关的知识,希望对你有一定的参考价值。
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
以上是关于算法根据每个值的概率返回对应值的主要内容,如果未能解决你的问题,请参考以下文章