Protocol buffers protobuf能编码概率分布吗?

Protocol buffers protobuf能编码概率分布吗?,protocol-buffers,Protocol Buffers,假设我有这个 message Game { string name = 1; repeated float probability = 2; } 其中,概率字段表示分布。这意味着每个值必须是非负的,且总和必须为1 是否有更好的方法使用protobuf(例如,类似于非负浮点数或在值和上设置边界的东西)?否,协议缓冲区中没有无符号浮点类型,也没有任何自动施加的类似约束 当您反序列化游戏时,您可能希望在业务代码中添加约束条件——意识到分数结果的浮点近似值之和可能不完全是1.0。您需要

假设我有这个

message Game
{
    string name = 1;
    repeated float probability = 2;
}
其中,
概率
字段表示分布。这意味着每个值必须是非负的,且总和必须为1


是否有更好的方法使用protobuf(例如,类似于
非负浮点数
或在值和上设置边界的东西)?

否,协议缓冲区中没有无符号浮点类型,也没有任何自动施加的类似约束


当您反序列化
游戏时,您可能希望在业务代码中添加约束条件
——意识到分数结果的
浮点
近似值之和可能不完全是1.0。您需要某种形式的容差。

不,协议缓冲区中没有无符号浮点类型,也没有任何像这样自动施加的约束


当您反序列化
游戏时,您可能希望在业务代码中添加约束条件
——意识到分数结果的
浮点
近似值之和可能不完全是1.0。您需要某种形式的公差。

仅使用一种类型无法安全地做到这一点。你可以更进一步说,这样做:

{
    string name = 1;
    repeated uint32 probability = 2;
    uint32 divisor = 3;
}

诀窍是将你的浮点数乘以一个大数字,大约1000 000,然后再除以它。这将给您带来安全,但也会增加开销。

仅使用一种类型无法安全地做到这一点。你可以更进一步说,这样做:

{
    string name = 1;
    repeated uint32 probability = 2;
    uint32 divisor = 3;
}

诀窍是将你的浮点数乘以一个大数字,大约1000 000,然后再除以它。这会给您带来安全,但也会增加开销。

与我在问题中的解决方案相比,此解决方案如何增加更多的保证?在我的情况下,概率不能为负数,除非您决定将负数转换为uint32。对于求和的情况,总是要进行验证。啊,对!我错过了。我认为这样做不值得开销/潜在的错误,但我很欣赏答案(+1)我的建议是在解析数据之后构建一个验证器,这样您就不必担心会发生什么。这是一个潜在的巨大开销,但它在开发和系统测试的后期阶段为您节省了大量诊断。与我所讨论的解决方案相比,此解决方案如何增加更多的保证?在我的情况下,概率不能为负,除非您决定将负数转换为uint32。对于求和的情况,总是要进行验证。啊,对!我错过了。我认为这样做不值得开销/潜在的错误,但我很欣赏答案(+1)我的建议是在解析数据之后构建一个验证器,这样您就不必担心会发生什么。这可能是一个巨大的开销,但在开发和系统测试的后期阶段,它为您节省了大量的诊断工作。