Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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 如何生成满足某些条件的三个随机整数?_Python_Python 3.x_Random - Fatal编程技术网

Python 如何生成满足某些条件的三个随机整数?

Python 如何生成满足某些条件的三个随机整数?,python,python-3.x,random,Python,Python 3.x,Random,我是一名编程初学者,我正在寻找一个好主意,如何生成满足条件的三个整数 例如: 我们得到了n=30,我们被要求生成三个整数a、b和c,这样7*a+5*b+3*c=n。 我尝试对循环使用,但它花费了太多时间,我的最大测试时间为1000毫秒 我正在使用Python 3 我的尝试: x = int(input()) c = [] k = [] w = [] for i in range(x): for j in range(x): for h in range(x):

我是一名编程初学者,我正在寻找一个好主意,如何生成满足条件的三个整数

例如:

我们得到了
n=30
,我们被要求生成三个整数a、b和c,这样
7*a+5*b+3*c=n
。 我尝试对循环使用
,但它花费了太多时间,我的最大测试时间为1000毫秒

我正在使用Python 3

我的尝试:

x = int(input())
c = []
k = []
w = []
for i in range(x):
    for j in range(x):
        for h in range(x):
           if 7*i + 5*j + 3*h = x:
              c.append(i)
              k.append(j)
              w.append(h)
if len(c) == len(k) == len(w) 
    print(-1)
else: 
    print(str(k[0]) + ' ' + str(c[0]) + ' ' + str(w[0]))

如果允许使用第三方库,则可以使用Symphy的解算器:

输出(随机):


为什么您的解决方案无法处理较大的
n值

您可能知道,范围为
i
for
循环中的所有内容都将运行
i
次。因此它将乘以
i
所花费的时间

例如,让我们假设(为了简单起见)此操作在4毫秒内运行:

if 7*a + 5*b + 3*c = n:
    c.append(a)
    k.append(b)
    w.append(c)
for c in range(n):
    if 7*a + 5*b + 3*c = n:
        c.append(a)
        k.append(b)
        w.append(c)
然后将在4×n毫秒内运行:

if 7*a + 5*b + 3*c = n:
    c.append(a)
    k.append(b)
    w.append(c)
for c in range(n):
    if 7*a + 5*b + 3*c = n:
        c.append(a)
        k.append(b)
        w.append(c)
大约:

  • n=100需要0.4秒
  • n=250需要1秒的时间
  • n=15000需要60秒
如果你把它放在
for
循环的
n
范围内,那么整个过程将重复
n
次。即

for b in range(n):
    for c in range(n):
        if 7*a + 5*b + 3*c = n:
            c.append(a)
            k.append(b)
            w.append(c)
将需要4n²毫秒

  • n=30需要4秒
  • n=50需要10秒
  • n=120需要60秒
将其放入第三个for循环需要4n³毫秒

  • n=10需要4秒
  • n=14需要10秒
  • n=24需要60秒

现在,如果将原始
if
减半为2毫秒,会怎么样<代码>n
在第一种情况下可以增加15000。。。在最后一个案例中为23。这里的教训是,更少的for循环通常比加快循环中的内容重要得多。正如您在Gulzar的答案第2部分中所看到的,只有两个for循环,这两个for循环有很大的不同。(这仅适用于循环彼此内部的情况;如果它们只是一个接一个的循环,则不存在乘法问题。)

首先,请注意,您的任务至少在两个方面没有明确规定:

  • 未指定生成值的允许范围。特别是,您没有指定结果是否包含负整数
  • 未指定所需的生成值
  • 通常情况下,如果没有指定,人们可能会假设方程的可能解集上的分布是预期的(因为它是给定集上最随机的可能分布)。但(离散)均匀分布只有在解集是有限的情况下才有可能,而在结果范围不受限制的情况下就不可能。(特别是,如果(a,b,c)是溶液,那么(a,b+3k,c)也是溶液− 对于任何整数k.)因此,如果我们将任务解释为要求具有无限范围的均匀分布,那么实际上是不可能的


    另一方面,如果允许我们选择任何分布和范围,任务就变得很简单:只需让生成器始终返回a=−n、 b=n,c=n。显然,这是方程的一个解(因为−7n+5n+3n=(−7+5+3)n=1n),并且将所有概率质量分配给单个点的退化分布仍然是有效的概率分布

    如果您想要一个稍微不那么退化的解决方案,您可以选择一个随机整数k(使用您选择的任何分布)并返回a=−n、 b=n+3k,c=n− 5公里。如上所述,这也是任何k的方程的解。当然,由于a的值是固定的,所以这个分布仍然有些退化

    如果您想让所有返回值至少具有一定的随机性,还可以选择一个随机h并返回a=−n+h,b=n− 2h+3k和c=n+h− 5公里。同样,这保证是任何h和k的有效解,因为它显然满足h=k=0的方程,而且很容易看出,增加或减少h或k都会使方程左侧的值保持不变

    事实上,可以证明,该方法可以生成方程的所有可能解,并且每个解都对应一个唯一的(h,k)对!(一种相当直观的方法是在3D空间中绘制解决方案,观察它们在2D平面上形成点的规则晶格,并且向量(+1,−2,+1)和(0,+3,−5) 如果我们从(至少在理论上)为每个整数分配非零概率的分布中选取h和k,那么我们将有一个非零概率返回任何有效解。因此,至少对于任务的一种合理解释(无限范围,任何完全分布),以下代码应:

    来自随机输入高斯
    def随机_溶液(n):
    h=int(高斯(0,1000))#任何完全支持整数的分布都可以
    k=int(高斯(0,1000))
    返回(-n+h,n-2*h+3*k,n+h-5*k)
    

    如果可能值的范围受到限制,问题就变得有点棘手了。在正的一面,如果所有的值都在下面(或上面)有界,那么可能的解集是有限的,因此在它上面存在一个均匀分布。另一方面,有效地对这种均匀分布进行采样并非易事

    一种可能的方法是,首先生成所有可能的解决方案(假设它们的数量有限),然后从解决方案列表中取样。我们可以像这样相当高效地生成解决方案:

  • 找到方程可能有解的a的所有可能值
  • 对于每一个这样的a,找出b的所有可能值,对于这些值仍然有一个解
  • 对于每个这样的(a,b)对,求解c的方程并检查i
    for c in range(n):
        if 7*a + 5*b + 3*c = n:
            c.append(a)
            k.append(b)
            w.append(c)
    
    for b in range(n):
        for c in range(n):
            if 7*a + 5*b + 3*c = n:
                c.append(a)
                k.append(b)
                w.append(c)
    
    n = 7*a + 5*b + 3*c
    c = (7*a + 5*b - n) / -3
    
    import random
    
    n = 30;
    max = 1000000;
    min = -1000000;
    
    while True:
      a = random.randint(min , max);
      b = random.randint(min , max);
      t = (7*a) + (5*b) - n;
      if (t % 3 == 0) :
        break;
    
    c = (t/-3);
    
    print("A = " + str(a));
    print("B = " + str(b));
    print("C = " + str(c));
    print("7A + 5B + 3C =>")
    print("(7 * " + str(a) + ") + (5 * " + str(b) + ") + (3 * " + str(c) + ") = ")
    print((7*a) + (5*b) + (3*c));