我必须使用random.randint从python 中的列表中随机选择名称。
到目前为止我已经完成了。但我无法弄清楚如何打印它们而不重复。 一些名字在10到15个名字之后重复它们。
请帮帮我。 我不允许使用任何高级功能。我应该使用简单的功能。这是我的计划。
import random
names = [about 150 names]
print([names[random.randint(0, len(names)-1)] for i in range(user_input)])
答案 0 :(得分:3)
如果您可以破坏性地修改names
,只需pop
值而不是复制它们。然后他们就不在了,所以你将无法重复。
如果您无法破坏性地修改names
,请对副本执行相同的操作:
tmp = names[:]
result = [tmp.pop(random.randrange(len(tmp))) for _ in range(user_input)]
这确实具有二次性能,因为列表中间的每个pop
必须将列表的一半移动一个档位。但对于150个名字,这不太可能成为问题。例如,在我的笔记本电脑上,从150个名称中选取100个值需要83微秒。
如果你真的不允许使用randrange,你可以自己写一下:
def randrange(x): return randint(0, x-1)
答案 1 :(得分:1)
这些限制非常愚蠢。我不确定“高功能”是什么,但是在我提供the function in your last question之后你还需要帮助,所以也许不允许函数声明?
但是,如果没有功能,你可以做同样的事情。您只需要跟踪已经使用过的指数。这是另一回事:
indices = []
for x in range(5):
index = random.randint(0, len(population)-1)
while index in indices:
index = random.randint(0, len(population)-1)
indices.append(index)
names = [population[i] for i in indices]
答案 2 :(得分:0)
假设您只能使用 randint 和基本操作(循环,分配和子列表) - 您可以执行“就地改组技巧”(Fisher Yates的现代版本)来实现这样的结果
copy = names[:]
for i in xrange( user_input-1, 1, -1 ):
swap = random.randint(0, i)
copy[i],copy[swap] = copy[swap],copy[i]
print copy[ :user_input ]
答案 3 :(得分:-1)
生成与names
sortarr = [random.randint(0, 10*len(names)) for i in range(len(names))]
并根据此新数组
对您的names
数组进行排序
names = [name for sa, name in sorted(zip(sortarr, names))]
它的作用是为names
分配一些随机数。它们可以重复,但它不会重复名称,因为如果两个数字相同,它们将被分配给一些任意名称。