<p><code>set()</code>只能包含唯一项。如果您尝试向<code>set()</code>添加一个已经存在的项,它将被忽略:</p>
<pre><code>>>> s = set()
>>> s.add(1)
>>> s
{1}
>>> s.add(1)
>>> s
{1}
</code></pre>
<p>在原始代码中,您实际上是在尝试“<em>将200个随机数添加到从0到100的集合中”。从概念上讲这是错误的,因为不可能从0到100的范围内得到200个唯一的随机数。在这个范围内最多只能得到100个唯一的随机数。你知道吗</p>
<p>代码的另一个问题是在每次迭代中随机选择数字,而不检查之前是否添加了数字。你知道吗</p>
<p>因此,为了将<code>N</code>随机数从0到<code>M</code>的范围内取出来,您必须执行以下操作:</p>
<pre><code>import random
s = set()
N = 100 # Number of items that will be appended to the set
M = 200 # Maximum random number
random_candidates = list(range(M))
for _ in range(N):
numbers_left = len(random_candidates)
# Choose a random number and remove it from the candidate list
number = random_candidates.pop(random.randrange(numbers_left))
s.add(number)
</code></pre>
<p>上述方法适用于小范围。如果您期望<code>M</code>是一个大的数字,那么生成一个大的<code>random_candidates</code>数组并不是非常有效的内存。你知道吗</p>
<p>在这种情况下,最好在循环中随机生成一个数字,直到找到之前没有选择的数字:</p>
<pre><code>import random
s = set()
N = 100 # Number of items that will be appended to the set
M = 2000 # Maximum random number
for _ in range(N):
random_candidate = random.randrange(M)
while random_candidate in s:
random_candidate = random.randrange(M)
s.add(random_candidate)
</code></pre>