Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试在Python中复制小型C代码_Python - Fatal编程技术网

尝试在Python中复制小型C代码

尝试在Python中复制小型C代码,python,Python,我试图用python复制一些C代码 这是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); f

我试图用python复制一些C代码

这是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;
}
我试图通过转换C代码在python中准确地复制这些结果。我的前3个结果(z=0,-3)是正确的,但是其余的结果是不正确的。当我将while循环更改为C中的等效循环时,只有前两个结果是正确的

Python代码的结果

1.0
0.20458727394278242
0.05097789283933862
-0.057596282822218514
-0.1508215598462347
-0.22737700216279746
-0.28610012088884856
-0.3272432217416562
-0.3519591169464781
-0.36186779773540745
-0.35878211836275675
我认为这是一个关于如何处理语言之间循环的简单问题

任何帮助都将不胜感激

编辑:

这是第一次尝试

def BitcoinAttackerSuccessProbablity(q, z):
# probablity of honest finding the next node is 1 - probablity the attacker will find the next
p = 1 - q
#lambda is equal to the number of blocks times by the division of attacker and honest finding the next block
lam = z * (q/p)
sum = 1.0


for k in range(0, z):
    poisson = math.exp(-1*lam)
    for i in range(1, k):
        poisson = poisson * (lam/i)
    sum = sum - (poisson * (1 - ((q/p)**(z-k))))

print(sum)

你没有在
之前将
i
重新初始化为零,而我你没有在
之前将
i
重新初始化为零,而我的python代码没有正确缩进。嗨@Hack\u Hut!我已经按照我认为的方式缩进了你的代码。将来,请花点时间好好地展示你的代码;它使阅读和运行更容易。我将你的
I=1
移动到外部循环中,得到的结果与C输出基本相同。你的python代码没有正确缩进。嗨@Hack_Hut!我已经按照我认为的方式缩进了你的代码。将来,请花点时间好好地展示你的代码;它使它更易于阅读和运行。我将您的
I=1
移动到外部循环中,得到的结果与C输出基本相同。绝对live saver,在这个简单的错误上让我挠头了2个多小时。干杯:)绝对的live saver,这个简单的bug让我抓狂了2个多小时。干杯:)
1.0
0.20458727394278242
0.05097789283933862
-0.057596282822218514
-0.1508215598462347
-0.22737700216279746
-0.28610012088884856
-0.3272432217416562
-0.3519591169464781
-0.36186779773540745
-0.35878211836275675
def BitcoinAttackerSuccessProbablity(q, z):
# probablity of honest finding the next node is 1 - probablity the attacker will find the next
p = 1 - q
#lambda is equal to the number of blocks times by the division of attacker and honest finding the next block
lam = z * (q/p)
sum = 1.0


for k in range(0, z):
    poisson = math.exp(-1*lam)
    for i in range(1, k):
        poisson = poisson * (lam/i)
    sum = sum - (poisson * (1 - ((q/p)**(z-k))))

print(sum)
def BitcoinAttackerSuccessProbablity(q, z):
    # probablity of honest finding the next node is 1 - probablity the attacker
    # will find the next
    p = 1 - q
    # lambda is equal to the number of blocks times by the division of attacker
    # and honest finding the next block
    lam = z * (q / p)

    return 1 - sum(
            (lam ** k) * math.exp(-lam) / math.factorial(k)
            * (1 - (q / p) ** (z - k))
            for k in range(0, z+1)
            )