【发布时间】:2020-05-19 03:43:44
【问题描述】:
如何在 0 到 5(含)之间生成 3 个随机数,其中最多可以有效地重复 2 个
所以我可以生成的列表可以是:
a = [0, 4, 2]
b = [5, 1, 4]
c = [5, 5, 3]
d = [2, 3, 2]
它无法生成如下列表:
a = [4, 4, 4]
【问题讨论】:
标签: python python-3.x random
如何在 0 到 5(含)之间生成 3 个随机数,其中最多可以有效地重复 2 个
所以我可以生成的列表可以是:
a = [0, 4, 2]
b = [5, 1, 4]
c = [5, 5, 3]
d = [2, 3, 2]
它无法生成如下列表:
a = [4, 4, 4]
【问题讨论】:
标签: python python-3.x random
我建议创建一个不超过 2 个重复项的列表并对其进行抽样:
import random
numbers = list(range(6)) * 2
print(random.sample(numbers, 3))
【讨论】:
["bob", "john", "mike", "sam", "james", "ross"]
首先创建一个包含 3 个随机数的列表,然后在所有 3 个相同的情况下循环,例如更改最后一个数字。
import random
lst = [random.randint(0, 5) for __ in range(3)]
while lst[0] == lst[1] == lst[2]:
lst[2] = random.randint(0, 5)
如果您有预定义的选择列表(如您对其他问题的评论),想法是相同的,只有其他功能(choice() 或 choices())用于随机选择:
import random
predefined = ["bob", "john", "mike", "sam", "james", "ross"]
lst = random.choices(predefined, k=3)
while lst[0] == lst[1] == lst[2]:
lst[2] = random.choice(predefined)
一些输出(lst 的值):
['mike', 'bob', 'mike'] ['sam', 'sam', 'ross'] ['ross', 'mike', 'james'] ['james', 'bob', 'ross'] ['james', 'sam', 'mike'] ['sam', 'mike', 'james'] ['sam', 'john', 'sam']
【讨论】:
这是解决这个问题的一种比较幼稚的方法:
import random
while True:
rand = [random.randint(0, 5) for x in range(0, 3)]
if len(set(rand)) > 1:
break
print rand
我们生成一个包含 0 到 5 之间的三个随机值的列表,然后转换为一个集合,如果集合中有多个唯一值,我们退出循环。
【讨论】:
设置列表:[0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
随机播放列表。
从随机列表中取出前三个数字。
为了提高效率,您只需在第 2 步运行 Fisher-Yates shuffle 的前三个步骤。
【讨论】: