Python:获取6个具有最小差异的随机数

时间:2019-03-05 08:52:42

标签: python random numbers difference

我正在尝试获取1到3600之间的6个随机生成的数字。但是我希望各个数字的最小差值至少为150。我已经创建了一个函数。我确实收到了6个随机数,但没有收到预期的差额。我的错误在哪里?我不知道。

我是python的新手。我尝试了不同的方法,但无法找到解决问题的方法。

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 :(得分:1)

这是一种方法,它使用拒绝无效时间的相同原理,直到我们获得所需的所有时间:

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]

使用all使拒绝逻辑更加简单,并且使用差异的abs可以避免处理两种不同的情况。

答案 1 :(得分:0)

问题是您只将新数字与列表中的最后一个数字进行比较。您需要使用它对照列表中所有数字的 all 进行检查,以获得所需的结果。下面是使用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的建议)。

答案 2 :(得分:0)

尝试以下操作:-

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