Python: получить 6 случайных чисел с минимальной разницей - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь получить 6 случайно сгенерированных чисел от 1 до 3600. Но я хочу, чтобы отдельные числа имели минимальную разницу не менее 150. Я уже создал функцию.Я получаю 6 случайных чисел, но не ожидаемую разницу.Где моя ошибка?Я не могу понять это.

Я очень плохо знаком с питоном.Я пробовал разные методы, но не смог найти решение для моей проблемы.

def get_random_seconds_with_difference(min_tx, max_tx, number_tx):
    s_times = []
    i_number = 0
    new_times_s = random.randint(min_tx,max_tx)
    s_times.append(new_times_s)
    while i_number < number_tx:
        new_times_s = random.randint(min_tx,max_tx)
        if new_times_s >= s_times[i_number]:
            difference_time_s = new_times_s - s_times[i_number]
        else:
           difference_time_s = s_times[i_number] - new_times_s

        if difference_time_s >= 150:
            s_times.append(new_times_s)
            i_number += 1

    return s_times

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Проблема в том, что вы сравниваете только новый номер с последним номером в списке.Вам нужно проверить это против всех числа в списке, чтобы получить желаемый результат.Ниже приведен пример с использованием цикла for:

import random

def get_random_seconds_with_difference(min_tx, max_tx, number_tx):
    s_times = []
    i_number = 0
    new_times_s = random.randint(min_tx,max_tx)
    s_times.append(new_times_s)
    while i_number < number_tx:
        new_times_s = random.randint(min_tx,max_tx)
        for i in range(len(s_times)):
            if new_times_s >= s_times[i]:
                difference_time_s = new_times_s - s_times[i]
            else:
                difference_time_s = s_times[i] - new_times_s

            if difference_time_s >= 150:
                s_times.append(new_times_s)
                i_number += 1
                break

    return s_times;

print(get_random_seconds_with_difference(1, 3600, 10))

Примечание. Вероятно, существует более быстрый способ сделать это и, возможно, уже встроенная функция (см. Комментарий выше с предложением random.choice).

0 голосов
/ 05 марта 2019

Попробуйте: -

import random
def choice(a):
    for _ in range(a):
        print(random.choice(range(1,3600,150)))

choice(6) #you can pass nomber to get value

Вывод: -

3451
2401
1201
301
1951
3451
0 голосов
/ 05 марта 2019

Вот способ сделать это, используя тот же принцип отклонения недействительных времен, пока мы не получим все, что нам нужно:

import random

def get_random_seconds_with_difference(min_tx, max_tx, number_tx):
    times = []
    while len(times) < number_tx:
        new_time = random.randint(min_tx, max_tx)
        if all(abs(new_time - time) >= 150 for time in times):
            times.append(new_time)
    return times

get_random_seconds_with_difference(0, 3600, 6)
# [2730, 435, 2069, 3264, 3496, 1091]

Использование все делает логику отклонениянемного проще, и использование abs разницы позволяет нам избежать рассмотрения двух разных случаев.

...