对于较大的数字,我的Python程序停止正确计数

对于较大的数字,我的Python程序停止正确计数,python,math,counting,Python,Math,Counting,我创建了一个程序来解决这个问题: 对于一个数字u,有多少个a、b、c构成:a+b+c=u 我的程序,首先用公式(u+2)进行数学计算/(u!*2!),然后通过在线程函数中生成3个随机数来查找它们,并在总和为u的情况下对它们进行计数 问题是当u>10时,程序的计数小于它应该返回的值。例如:对于u=20,当它应该是231时,它只继续计数202 代码如下: import threading; import random; import math; count=0; u=6; def math_coun

我创建了一个程序来解决这个问题: 对于一个数字u,有多少个a、b、c构成:
a+b+c=u

我的程序,首先用公式
(u+2)进行数学计算/(u!*2!)
,然后通过在线程函数中生成3个随机数来查找它们,并在总和为u的情况下对它们进行计数

问题是当
u>10
时,程序的计数小于它应该返回的值。例如:对于u=20,当它应该是231时,它只继续计数202

代码如下:

import threading;
import random;
import math;
count=0;
u=6;
def math_count():
    global u;
    result = math.factorial(u+2)/( math.factorial(u)*2);
    print(result);
def show():
    global count;
    print("finded:"+str(count));
    threading.Timer(1,show).start();
def main():
    global count;
    threading.Timer(0.01,main).start();
    for n in range(1,10000):
        a = random.randint(0,u);
        b = random.randint(0,u);
        c = random.randint(0,u);
        arr1 = [a,b,c];
        name = str(arr1[0])+str(arr1[1])+str(arr1[2]);
        if (name not in globals())&(a+b+c==u):
            count+=1;
            globals()[name] = True;
math_count();   
main();
show();

在python中,很少使用/修改全局范围。 我已经试着把你的代码调整得更像Python

我不确定你想用线程做什么,但在这里它似乎只是把事情弄糊涂了

我认为你的问题是你在有限的搜索空间中选择了随机值。因此,不能保证找到完整的解决方案集

在这里,我将其更改为工作,直到通过while循环找到解决方案:

import random
import math

def find_target(u):
    result = math.factorial(u+2)/( math.factorial(u)*2);
    return result

def search(u, target):
    result_sets = set()
    while len(result_sets) < target:
        a = random.randint(0, u)
        b = random.randint(0, u)
        c = random.randint(0, u)
        arr1 = (a, b, c)
        if sum(arr1) == u:
            result_sets.add(arr1)
    return result_sets
        

u = 20
target = find_target(u)
print(target)
result_sets = search(u, target)
print(len(result_sets))
print(result_sets)
随机导入
输入数学
def查找_目标(u):
结果=数学阶乘(u+2)/(数学阶乘(u)*2);
返回结果
def搜索(u,目标):
结果_集合=集合()
而len(结果集)<目标:
a=随机的随机数(0,u)
b=随机随机随机数(0,u)
c=随机随机。随机数(0,u)
arr1=(a,b,c)
如果总和(arr1)=u:
结果集添加(arr1)
返回结果集
u=20
目标=查找目标(u)
打印(目标)
结果集=搜索(u,目标)
打印(镜头(结果集))
打印(结果集)
产出:

231.0

231

{(15,5,0)、(3,13,4)、(5,3,12)、(9,1,10)、(5,4,11)、(9,9,2)、(7,13,0)、(6,10,4)、(5,2,13)、(6,11,3)、(9,7,4)、(0,13,7)、(0,14,6)、(8,4,8)、(2,4,14)、(10,10,0)、(7,12,1)、(6,8,6,6)、(1,1,18)、(6,9,5)、(0,4,16)、(0,11,9)、(0,12,8,8,8,8)、(1,4)、(10,4)、(4)、(10,4)、(10)、(10)、(10)、(10)、(4))),(13, 4, 3), (4, 12, 4), (14, 1, 5), (3, 1, 16), (3, 2, 15), (0, 10, 10), (3, 9, 8), (2, 17, 1), (17, 3, 0), (13, 1, 6), (18, 1, 1), (7, 1, 12), (1, 14, 5), (4, 10, 6), (13, 2, 5), (7, 2, 11), (18, 2, 0), (3, 0, 17), (3, 7, 10), (2, 15, 3), (17, 1, 2), (11, 1, 8), (17, 2, 1), (0, 1, 19), (5, 14, 1), (1, 12, 7), (18, 0, 2), (7, 0, 13), (9, 10, 1), (5, 12, 3), (11, 0, 9), (0, 0, 20), (5, 13, 2), (8, 6, 6), (8, 7, 5), (4, 0, 16), (9, 8, 3), (12, 6, 2), (5, 11, 4), (12, 7, 1), (8, 5, 7), (2, 5, 13), (1, 2, 17), (12, 5, 3), (15, 4, 1), (5, 1, 14), (0, 20, 0), (2, 3, 15), (2, 11, 7), (1, 0, 19), (4, 13, 3), (12, 4, 4), (15, 2, 3), (2, 1, 17), (3, 10, 7), (5, 0, 15), (0, 19, 1), (16, 4, 0), (4, 11, 5), (7, 10, 3), (15, 0, 5), (3, 8, 9), (6, 7, 7), (3, 16, 1), (7, 8, 5), (10, 7, 3), (7, 9, 4), (6, 5, 9), (6, 6, 8), (20, 0, 0), (11, 8, 1), (0, 8, 12), (11, 9, 0), (0, 9, 11), (1, 19, 0), (7, 7, 6), (10, 5, 5), (10, 6, 4), (4, 1, 15), (13, 0, 7), (6, 4, 10), (4, 9, 7), (0, 6, 14), (11, 7, 2), (0, 7, 13), (14, 6, 0), (2, 13, 5), (10, 3, 7), (10, 4, 6), (17, 0, 3), (1, 10, 9), (4, 7, 9), (14, 4, 2), (3, 4, 13), (8, 12, 0), (2, 12, 6), (5, 10, 5), (1, 8, 11), (1, 9, 10), (15, 3, 2), (7, 4, 9), (2, 10, 8), (5, 8, 7), (5, 9, 6), (9, 6, 5), (2, 18, 0), (8, 3, 9), (1, 7, 12), (15, 1, 4), (8, 11, 1), (3, 17, 0), (9, 4, 7), (5, 7, 8), (12, 3, 5), (9, 5, 6), (19, 1, 0), (8, 1, 11), (8, 2, 10), (8, 9, 3), (2, 9, 9), (16, 3, 1), (3, 15, 2), (12, 1, 7), (6, 14, 0), (12, 2, 6), (5, 6, 9), (9, 3, 8), (19, 0, 1), (8, 0, 12), (2, 0, 18), (0, 17, 3), (2, 7, 11), (16, 1, 3), (16, 2, 2), (6, 12, 2), (6, 13, 1), (12, 0, 8), (3, 6, 11), (0, 15, 5), (3, 14, 3), (0, 16, 4), (9, 2, 9), (16, 0, 4), (13, 6, 1), (7, 6, 7), (13, 7, 0), (4, 8, 8), (4, 15, 1), (4, 16, 0), (14, 5, 1), (3, 5, 12), (6, 3, 11), (3, 12, 5), (9, 0, 11), (11, 6, 3), (1, 17, 2), (13, 5, 2), (1, 18, 1), (4, 6, 10), (7, 5, 8), (4, 14, 2), (14, 3, 3), (3, 3, 14), (6, 2, 12), (3, 11, 6), (11, 5, 4), (0, 5, 15), (1, 15, 4), (7, 3, 10), (1, 16, 3), (10, 2, 8), (7, 11, 2), (6, 0, 14), (6, 1, 13), (4, 5, 11), (5,15,0),(11,3,6),(0,3,17),(11,4,5),(14,2,4),(8,10,2),(10,0,10),(4,3,13),(9,11,0),(11,2,7),(0,2,18),(0,18,2),(8,4),(14,8,10),(2,16,2),(1,5,14),(1,6,13,6),(12,8,0),(2,6,12),(5,10),(2,14),(1,3,15),(1,11)}


1121
11、2和1;1、12和1;还是1、1和21?LUL,非常感谢!!我修正了它,在数字中加了一个“0”。我在这个论坛上很新,我怎么才能提高你的声誉?是的,我最近学习了Python,所以我无法摆脱由于其他语言而产生的使用somi冒号的狂热哈哈哈(很抱歉,但是@JoshuaHall我刚刚知道分号在javascript中也是可选的,因为我用“;”来分隔我的“名字”的数字)变量,我的代码正在运行。但是,无论如何,谢谢。线程的目的是在可能性很大的情况下不会使程序崩溃。线程的使用可能是一个单独的问题,但请记住,在python中,线程主要是为了在I/O是瓶颈的情况下提高性能,而没有提供任何改进在CPU性能方面。如果你真的想利用你所有的核心,看看多处理,或者并发处理池。