算法根据每个值的概率返回对应值

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
	
	# 循环获取 50var 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

以上是关于算法根据每个值的概率返回对应值的主要内容,如果未能解决你的问题,请参考以下文章

Python:计算列中每个值的有效概率[关闭]

matlab一维概率分布和均匀分布的区别

根据列值返回 SQL Server 列名和对应值

从使用 wkwebview 返回值的 javascript 调用 swift 函数

遗传算法

概率分布