如何在 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))
如果你想从1
到n
而不是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 个数字并随机选择任意数字?的主要内容,如果未能解决你的问题,请参考以下文章