生成带有X位数字的N个随机数,以使差异(从上到下减去的数字)为正

时间:2019-01-10 19:38:50

标签: random language-agnostic difference

我正在尝试生成N个随机数和X个数字,以使差异始终为正。

我认为最好的方法是生成N个数字

google_maps_flutter然后对它们进行排序,10,11,30,49,50并找到差异50,49,30,11,10,如果差异为负,例如在这种情况下,我将重新进行整个过程。

您可以想象,这是一种非常强力的方法,而且速度很慢。有更好的方法吗?

如果有帮助,N和X最多为5。

如果不清楚,

我需要的是生成一组数字。然后,当您减去所有这些数字时,您会得到肯定的答案。在我的示例中,我生成的随机数是10、11、30、49、50。我知道获得正数的最佳方法是从最小的数中减去最大的数。所以我从最大到最小订购了它们。 50,49,30,11,10然后减去它们,我得到-50(负数),所以我必须重新开始,直到得到90,20,30,10,11之类的东西,当排序时,我得到90,30 ,20,11,10,这是19(正数),当减去所有内容后我就可以停止

我也不介意是否必须做几次,但我想将尝试次数保持在最低水平

换句话说,我正在尝试生成一系列数字,其中最大值减去所有其他值的总和始终为正

1 个答案:

答案 0 :(得分:1)

您可以使用基于斐波那契数列的随机方法生成一个数字。

在斐波那契数列中,您将根据之前的数字生成一个数字。如果您想要一个随机的正数,只需生成一个随机数并将其添加到最后一个,即可始终满足您的要求。

我在python中创建了一个代码段

import random

number_list=[]
r_number=0
while(r_number < 100):
    b_number=random.randint(1,10)
    r_number += b_number
    if r_number<100:
        number_list.append(r_number)
print(number_list)

结果:

首次执行:

[4, 14, 22, 24, 26, 28, 29, 34, 35, 36, 46, 48, 51, 56, 64, 72, 79, 89, 98]

第二次执行:

[7, 13, 19, 27, 34, 35, 39, 43, 45, 48, 52, 58, 68, 74, 83, 86, 88, 93, 99]

此方法的优点(如果您对代码进行一些优化,可能会更好),它的复杂度是O(n)(线性),而不是您使用的任何排序算法。

我希望我解决了你的疑问 最后,我个人认为:排序最好的集合是已经排序的集合。

编辑1:我看到您需要最大数量大于其他数量的总和,这是一个简单的变化。

import random

number_list = []
r_number = random.randint(1, 10)
LIMIT=1000

while r_number < LIMIT:
    sum_ = sum(number_list)
    r_number = random.randint(sum_, sum_ + 10)
    number_list.append(r_number)

if number_list[-1] > LIMIT:
    del number_list[-1]

print(number_list)
print("Last element minus the rest equals",number_list[-1] - (sum(number_list) - number_list[-1]))

结果

[3, 4, 7, 21, 37, 72]
0

[9, 19, 38, 74]
8

[4, 4, 11, 20, 47, 96]
10

[4, 5, 10, 26, 55]
10

我只是尝试将LIMIT设置为1e99并对其进行计时:

Last element minus the rest equals 7

real    0m0,023s
user    0m0,020s
sys     0m0,000s

您可以从中推断出很多输出

./test.py |wc -c
17109

计算程序输出给出的字符数。在这种情况下,真的是长整数。