You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Z3浮点数求解结果固定而非随机?

固定Z3浮点数求解结果的方法

Z3的浮点数求解模块有独立的配置逻辑,常规的整数求解种子设置无法覆盖浮点数求解器的随机化策略,需要针对浮点数模块单独配置:

  • 改用QF_FP专用求解器:避免通用求解器自动选择带有随机启发式的策略,强制使用确定性的浮点数求解路径
  • 单独禁用浮点数求解器的随机化:设置fp.randomize=False,这是浮点数模块特有的配置项
  • 补充设置算术相关的随机种子:确保所有可能影响求解的种子都固定

修改后的代码如下:

from z3 import *

# 全局固定算术及浮点数相关种子
set_option('smt.random_seed', 0)
set_option('smt.arith.random_seed', 0)
set_option('smt.arith.random_initial_value', False)

def test_short_expont():
    float_type = Float32()
    # 指定QF_FP逻辑,使用专用浮点数求解器
    solver = SolverFor("QF_FP")
    # 禁用浮点数求解器的随机化
    solver.set("fp.randomize", False)
    
    fp_5 = FP('fp_5', float_type)
    fp_10 = FP('fp_10', float_type)
    
    solver.add(fpEQ(fpAdd(RNE(), fp_5, fp_5), fp_10))
    
    if solver.check() == sat:
        model = solver.model()
        return model
    else:
        return

# 测试运行
print(test_short_expont())

修改后每次运行都会得到相同的模型结果,解决了浮点数求解的随机性问题。

内容的提问来源于stack exchange,提问作者Jrzhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:15:06