生成两个不同的随机数列表

时间:2019-07-08 15:06:57

标签: python list random

我想生成两个不同的随机数列表。 条件是第一个列表索引的值不能等于相同索引中的第二个列表值。

例如,a=[5,6,7,5]q=[2,7,3,5]在这种情况下,列表q中第四个索引的值等于列表a中相同索引中的值。我想避免这种情况。我创建了一个列表

import random
a=[]
b=list(range(1,7164))
for i in b:
   t=random.randint(1,20)
   a.append(t)

如何生成具有上述条件的第二个列表?

7 个答案:

答案 0 :(得分:2)

我认为最好的方法是对每个项目进行迭代,并以一个与原始值不相同的方式用一个随机数补偿它。 在代码末尾添加以下内容:

c = []
for i in range(len(a)):
    t = (a[i] + random.randint(1, 19)) % 19 + 1
    c.append(t)

这样,您可以用1-18之间的数字偏移每个项目,如果超过19,则将其环绕。(+ 1表示介于1和19之间,而不是0)

答案 1 :(得分:2)

这会将lifelinesa创建为元组,但是您可以轻松地将它们转换为列表。

q

答案 2 :(得分:2)

希望这对您有帮助。 可以使用随机数从列表中随机选择一个项目。

例如,如果列表中有10个索引在0到9之间的项目,则可以生成0到9之间的随机整数,并使用它从列表中随机选择一个项目。 choice()函数可为您实现此行为。选择的可能性是统一的。

下面的示例生成一个包含20个整数的列表,并给出了五个从列表中选择一个随机项的示例。

# choose a random element from a list
from random import seed 
from random import choice
# seed random number generator
seed(1)
# prepare a sequence
sequence = [i for i in range(20)]
print(sequence)
# make choices from the sequence
for _ in range(5):
  selection = choice(sequence)
  print(selection)

首先运行示例,然后打印整数值列表,然后是从列表中选择和打印随机值的五个示例。

 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
 4
 18
 2
 8
 3

答案 3 :(得分:2)

import random

def generate_n_lists(num_of_lists, num_of_elements, value_from=0, value_to=100):
    s = random.sample(range(value_from, value_to + 1), num_of_lists * num_of_elements)
    return [s[i*num_of_elements:(i+1)*num_of_elements] for i in range(num_of_lists)]

print(generate_n_lists(2, 5, 0, 20))    # generate 2 lists, each 5 elements, values are from 0 to 20

打印:

[[1, 16, 4, 3, 15], [0, 10, 14, 17, 7]]

答案 4 :(得分:1)

为避免这种情况,只需检查是否重复即可。如果是,请再次生成一个不同的随机数。

import random
a=[]
b=list(range(1,7164))
for i in b:
    t=random.randint(1,20)
    while t == i:
        t = random.randint(1,20)
    a.append(t)
print(a)

答案 5 :(得分:1)

有多种方法可以做到这一点。

一种方法是在较小的范围内生成第二个随机值,如果等于或超过排除值,则将其偏移:

excluded_value = first_list[i]
new_value = random.randint(1, 19)
if new_value >= excluded_value:
    new_value += 1

另一种方法是同时生成列表,使用random.sample进行选择而不进行替换。

possible_values = range(1, 20) # or xrange on python 2.x
while i < desired_num_values:
    a, b = random.sample(possible_values, 2)
    first_list.append(a)
    second_list.append(b)
    i += 1

我没有进行分析以查看是否存在明显的性能差异。在没有冲突之前,两者似乎都比重复生成随机数要快(但同样,我没有进行分析确认)。如果您想要两个以上的列表,则第二个可以更优雅地扩展。

这些不是唯一的方法。

答案 6 :(得分:1)

import random
a=[]
b=[]
for rand_a in range(1,7164):
    a.append(random.randint(1,20))

random.seed()
for rand_b in range(1,7164):
    r = random.randint(1,20)
    # keep rolling until you get a diff number
    while (a[rand_b] == r):
        r = random.randint(1,20)
    b.append(r)


您的代码示例包含1个随机列表和1个列表1,7164。 此代码将为您生成两个包含1,20的列表,总共17164个元素,这些元素根据它们在另一个列表中的位置而有所不同。 种子可能不是必需的,但