【Godot】根据权重返回值,用于随机掉落物品

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

发表评论