Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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 随机选择3个数字,其总和为356,且这3个数字中的每一个都大于30_Python_Python 2.7 - Fatal编程技术网

Python 随机选择3个数字,其总和为356,且这3个数字中的每一个都大于30

Python 随机选择3个数字,其总和为356,且这3个数字中的每一个都大于30,python,python-2.7,Python,Python 2.7,请问我如何能随机选择3个总数为356且每一个都超过30的数字 所以输出应该是例如[100,34,222] (但不是[1,5350]) 我想用随机模块来做这个。谢谢大家! 这个问题对于“随机”的定义以及您希望复制的分布来说相当主观 最简单的解决方案: 选择一个随机数,rand1:[30296] 选择第二个随机数,rand2:[30,(326-Rand1)] 然后,由于约束,第三个不能是随机的,因此通过356-(rand1+rand2) 当选择第一个数字时,它必须是31或更多,并且必须在表中至少留

请问我如何能随机选择3个总数为356且每一个都超过30的数字

所以输出应该是例如[100,34,222] (但不是[1,5350])


我想用随机模块来做这个。谢谢大家!

这个问题对于“随机”的定义以及您希望复制的分布来说相当主观

最简单的解决方案:

  • 选择一个随机数,
    rand1
    :[30296]
  • 选择第二个随机数,
    rand2
    :[30,(326-Rand1)]
  • 然后,由于约束,第三个不能是随机的,因此通过
    356-(rand1+rand2)

当选择第一个数字时,它必须是
31
或更多,并且必须在表中至少留下62个数字(假设数字不必不同),因为其他两个数字也需要是31或更高

因此,它需要来自包含范围
31..(356-31-31)

对于第二个数字,它必须是
31
或更多,并且必须在表中为最后一个数字保留至少
31

因此,其包含范围将为
31..(356-31-first)

然后,最后一个数字就是356 first second(第一秒)

关于在Python中生成一个范围内的随机数,已经有很多答案,因此我不会重复这些信息,但是下面的代码显示了如何为这两个数字选择范围并计算第三个:

import random
first = random.randint(31,356-31-31)
second = random.randint(31,356-31-first)
third = 356 - first - second
print first, second, third, (first + second + third)
这可能会有所不同,取决于您是否允许重复,但这个答案应该为您提供基本的方法

import random

def rnd_to_sum_with_min(desired_sum=356, numbers=3, minimum=31):
    selection = []
    for i in range(numbers-1):
        upper_limit = desired_sum - sum(selection) - (numbers - i) * minimum
        choice = random.randint(minimum, upper_limit)
        selection.append(choice)
    selection.append(desired_sum - sum(selection))
    return selection
此解决方案使用一个函数。这样可以动态修改参数。这是一个健壮的解决方案

该方法是随机选择前N-1个数字,并根据与所需和的差值确定最后一个数字。每个数字的确定方法是:首先知道所需的最小值,然后根据所需的总和计算该数字的上限,以及已选择的数字,确保为接下来的n个数字留出足够的空间

我还编写了一个递归函数,只是为了好玩(速度更快):


由于您正在查找三元组的总和,请尝试:

>>> from random import randint
>>> _max = 356
>>> _min = 31
>>> truemax = 356-31*3
>>> truemax
263
>>> x = randint(0,truemax)
>>> y = randint(0,truemax - x)
>>> z = truemax - x - y
>>> x,y,z = x+_min, y+_min, z+_min
>>> x,y,z
(73, 185, 98)
>>> sum([x,y,z])
356
从数学上讲,如果没有
min
,其中(356-x-y)是一个填充词:

356 = x + y + (356 - x - y)
既然有一个最低限度,那就是

356 = 31 + x + 31 + y + 31 + z
356 = 31 * 3 + x+y+z
所以,当你生成随机数时,你实际上是在生成263,而不是356,因为最大值

要缩放方法,请执行以下操作:

from random import randint

def generate(numint, _min, _max):
    current_sum = 0
    truemax = _max - numint*_min
    for i in range(numint-1):
        x = randint(0,truemax - current_sum)
        current_sum+=x
        yield _min + x
    yield truemax - current_sum + _min

_list  = [i for i in generate(3, 31, 356)]
print sum(_list), _list
[out]:

alvas@ubi:~$ python test.py
356 [198, 104, 54]
alvas@ubi:~$ python test.py
356 [82, 212, 62]
alvas@ubi:~$ python test.py
356 [214, 76, 66]
alvas@ubi:~$ python test.py
356 [184, 85, 87]
alvas@ubi:~$ python test.py
356 [140, 73, 143]
alvas@ubi:~$ python test.py
356 [216, 46, 94]
alvas@ubi:~$ python test.py
356 [162, 39, 155]
alvas@ubi:~$ python test.py
356 [112, 50, 194]
alvas@ubi:~$ python test.py
356 [169, 121, 66]

说真的,这比我的简单?没有必要使用while循环进行彻底的搜索,我只是对效率非常迂腐。是的,在这种情况下足够公平了。这没关系,我的背景是HPC,所以这只是我自动思考问题的方式!对不起,山姆,
[30,(326-Rand1)]
结尾的
3)
让我很困惑,因为我认为这是它的一部分,而不是下一点。编辑成清晰的分开的点,希望你们不介意。@Padraic所以我们希望我们不想运行几百次。无论如何,与其他答案相比,更喜欢这个答案的真正原因是它优雅简洁,而不仅仅是一个代码转储。在任何情况下,两个答案都不是完美的——我认为帕克斯-迪布洛的答案是如何回答给定问题的。Inbar,没有解释的倾销代码是问了很多的OP。如果你解释了它的作用,这将是更好的。看起来OP更喜欢那个OP是正确的,当然。毕竟这是他们的问题,所以,如果他们只是想在不理解的情况下使用它,那没关系。就我个人而言,我仍然希望看到一个解释。不,不,我只是谈论了Inbar和其他解决方案之间的速度。我当然更愿意理解它,所以请在酒吧里,发表一些关于它的话。非常感谢。这更好,尽管我担心那些编写递归函数“只是为了好玩”的人:-)谢谢大家,伙计们的帮助!
alvas@ubi:~$ python test.py
356 [198, 104, 54]
alvas@ubi:~$ python test.py
356 [82, 212, 62]
alvas@ubi:~$ python test.py
356 [214, 76, 66]
alvas@ubi:~$ python test.py
356 [184, 85, 87]
alvas@ubi:~$ python test.py
356 [140, 73, 143]
alvas@ubi:~$ python test.py
356 [216, 46, 94]
alvas@ubi:~$ python test.py
356 [162, 39, 155]
alvas@ubi:~$ python test.py
356 [112, 50, 194]
alvas@ubi:~$ python test.py
356 [169, 121, 66]