如何将比特币白皮书中的攻击者成功概率C代码复现至Python?
将比特币白皮书中的攻击者成功概率C代码转换为Python实现
嘿,我来帮你把这段实现比特币白皮书攻击者成功概率的C代码转成Python版本。先看看原C代码是怎么写的:
#include <math.h> double AttackerSuccessProbability(double q, int z) { double p = 1.0 - q; double lambda = z * (q / p); double sum = 1.0; int i, k; for (k = 0; k <= z; k++) { double poisson = exp(-lambda); for (i = 1; i <= k; i++) poisson *= lambda / i; sum -= poisson * (1 - pow(q / p, z - k)); } return sum; }
接下来是对应的Python实现,我尽量保持逻辑和原代码完全一致,同时贴合Python的语法习惯:
import math def attacker_success_probability(q: float, z: int) -> float: p = 1.0 - q lambda_val = z * (q / p) # 避开Python内置的lambda关键字 sum_val = 1.0 for k in range(z + 1): poisson = math.exp(-lambda_val) for i in range(1, k + 1): poisson *= lambda_val / i sum_val -= poisson * (1 - math.pow(q / p, z - k)) return sum_val
几点小说明:
- 把变量名
lambda改成了lambda_val,因为lambda是Python的关键字,不能直接用作变量名 - 用Python的
range()函数替代了C的for循环逻辑,range(z+1)刚好覆盖k从0到z的所有整数 - 加了可选的类型提示,让代码的参数和返回值类型更清晰,符合现代Python的写法
- 所有数学运算都使用了Python标准库
math里的对应函数,和C的math.h行为完全一致
你可以测试一下,比如传入q=0.1、z=5,两种语言的输出应该完全一致,能验证转换的正确性。
内容的提问来源于stack exchange,提问作者Hack_Hut
相关产品推荐
相关产品推荐

