генерировать N случайных чисел с X цифрами так, чтобы разница (числа, вычитаемые сверху вниз) была положительной - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сгенерировать N случайных чисел с количеством X разрядов, чтобы разница всегда была положительной.

Лучший способ сделать это - сгенерировать N чисел

10,11,30,49,50 затем сортируйте их, 50,49,30,11,10 и найдите разницу -50, и если она отрицательная, как в этом случае, я бы повторил весь процесс заново.

Как вы можете себе представить, это очень грубый и медленный способ. Есть ли лучший способ сделать это?

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 голосов
/ 10 января 2019

Вы можете просто сгенерировать число случайным методом на основе последовательности Фибоначчи.

В последовательности Фибоначчи вы генерируете число на основе предыдущих. Если вам нужно случайное положительное число, просто сгенерируйте случайное число и добавьте его к последнему, это всегда будет соответствовать вашим требованиям.

Я сделал фрагмент в 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

Который подсчитывает символы, указанные в выходных данных программы. В этом случае действительно длинные целые числа.

...