-4

我必须使用 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)])
4

4 回答 4

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)
于 2014-01-18T09:59:36.507 回答
1

这些限制非常愚蠢。我不确定什么是“高级功能”,但是在我在上一个问题中提供了功能后,您仍然需要帮助,所以可能不允许函数声明?

不过,你可以在没有函数的情况下做同样的事情。您只需要跟踪您已经使用过的索引。这是另一个尝试:

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]
于 2014-01-18T09:57:52.753 回答
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 ]
于 2014-01-18T09:52:26.413 回答
-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. 它们可以重复,但不会重复名称,因为如果两个数字相同,它们将被分配给一些任意名称。

于 2014-01-18T09:54:38.520 回答