如何在 Python 中列出 n 个数字并随机选择任意数字?

Posted

技术标签:

【中文标题】如何在 Python 中列出 n 个数字并随机选择任意数字?【英文标题】:How to make a list of n numbers in Python and randomly select any number? 【发布时间】:2011-11-25 21:48:50 【问题描述】:

我数了数,结果是 N。

现在我想要一个列表,其中包含 1 到 N 个数字。

例子:

N = 5

那么,count_list = [1, 2, 3, 4, 5]

此外,一旦我创建了列表,我想从该列表中随机选择一个数字并使用该数字。

之后,我想从列表的剩余数字 (N-1) 中选择另一个数字,然后也使用它。

这样下去列表是空的。

【问题讨论】:

您的列表包含从 1 到 N,而不是从零到 N。 您希望 N 有多大? 10? 10^8?这很重要;提供的所有答案都假设 O(N) 空间复杂度......你确定要这个吗?在您的问题中,您非常明确地说“现在我想要一个列表”,但我想确保您意识到这意味着什么。 我从没想过这么深。我实际上是在寻找一个列表,其中 N 的最大值约为 20 到 30。但是既然你提到了这一点,作为我的学习练习,你能帮我做以下事情吗: 1. O(N) 空间复杂度是多少? 2、当我的列表大约10^8时会发生什么 你可以看看***.com/questions/487258/…关于Big O。大约N=10^8...只需尝试先运行你的程序为N=10^5,然后N=10 ^6 等...您无需测量即可看到差异。 @Sunny:Gandi 的链接非常好,但有点冗长和技术性。简短的回答:Big O 的意思是“如果我有更多的元素,我的过程会变得多贵?”。人们通常关注“时间复杂度”,即需要多长时间,但几乎总是忘记“空间复杂度”,即它需要多少内存。相信我——一个包含 1 亿个整数的数组在 Python 中会占用大量内存! :) 我只是在 shell 中运行“range(10 ** 8)”,它占用了 1.6GB!。 【参考方案1】:

你可以试试这个代码

import random
N = 5
count_list = range(1,N+1)
random.shuffle(count_list)

while count_list:
    value = count_list.pop()
    # do whatever you want with 'value'

【讨论】:

while count_list: 足以测试count_list 是否不是空列表...【参考方案2】:

创建列表(已编辑):

count_list = range(1, N+1)

选择随机元素:

import random
random.choice(count_list)

【讨论】:

[x+1 for x in xrange(N)] == range(1, N+1)【参考方案3】:

至于第一部分:

>>> N = 5
>>> count_list = [i+1 for i in xrange(N)]
>>> count_list
[1, 2, 3, 4, 5]
>>>

至于第二个,请阅读9.6. random — Generate pseudo-random numbers

>>> from random import choice
>>> a = choice(count_list)
>>> a
1
>>> count_list.remove(a)
>>> count_list
[2, 3, 4, 5]

这就是一般的想法。

顺便说一句,你可能也有兴趣 在阅读中Random selection of elements in a list, with no repeats (Python recipe)

有一些快速随机选择的实现。

【讨论】:

【参考方案4】:

您可以通过以下方式创建元素的枚举:

mylist = list(xrange(10))

然后您可以使用random.choice 函数来选择您的项目:

import random
...
random.choice(mylist)

正如 Asim Ihsan 正确指出的那样,我的回答并未解决 OP 的全部问题。要从列表中删除值,只需调用 list.remove()

import random
...
value = random.choice(mylist)
mylist.remove(value)

正如 takataka 所指出的,xrange 内置函数在 Python 3 中被重命名为 range

【讨论】:

xrange 在 python3 中不起作用。只需将range 用于python3。【参考方案5】:

如果你想选择一个随机元素,你不需要计算东西。只需使用 random.choice() 并传递您的可迭代对象:

import random
items = ['foo', 'bar', 'baz']
print random.choice(items)

如果你真的要数一数,请使用random.randint(1, count+1)

【讨论】:

【参考方案6】:

你可以使用:

import random
random.choice(range(n))

或:

random.choice(range(1,n+1))

如果你想从1n 而不是0

【讨论】:

【参考方案7】:

之后,我想从列表的剩余数字 (N-1) 中选择另一个数字,然后也使用它。

那么您可能真的不想创建一个从 1 到 N 的数字列表,只是为了选择一个(为什么不直接要求该范围内的随机数,而不是显式创建它以供选择? ),而是改组这样的列表。幸运的是,random 模块也为您提供了支持:只需使用 random.shuffle

当然,如果您有一个庞大的数字列表并且您只想绘制几个,那么使用random.choice 绘制每个数字并将其删除当然是有意义的。

但是...为什么要从一个范围中选择与某些项目的计数相对应的数字?您要使用该数字来选择其中一项吗?不要那样做;这会让事情变得太复杂。如果您想选择其中一项,请直接选择 - 再次使用 random.choice

【讨论】:

【参考方案8】:

维护一个set并移除一个随机拾取的元素(带有choice)直到列表为空:

s = set(range(1, 6))
import random

while len(s) > 0:
  s.remove(random.choice(list(s)))
  print(s)

三次运行给出三个不同的答案:

>>>
set([1, 3, 4, 5])
set([3, 4, 5])
set([3, 4])
set([4])
set([])
>>>
set([1, 2, 3, 5])
set([2, 3, 5])
set([2, 3])
set([2])
set([])

>>>
set([1, 2, 3, 5])
set([1, 2, 3])
set([1, 2])
set([1])
set([])

【讨论】:

以上是关于如何在 Python 中列出 n 个数字并随机选择任意数字?的主要内容,如果未能解决你的问题,请参考以下文章

python中怎么设置随机产生数字

c++中如何产生随机字符串

从集合中随机选择一个/多个函数并应用组合

python随机生成近100年内的200个人的生日,统计同一天出生的人数,并按照人数的多少从高到底排序?

如何从 Python 中的目录中读取 n 个文件?

如何在 Java 中生成随机排列?