从 2 个范围中获取 1 个数字,其中包含选择()和兰丁()

我有一个代码块


import random as r

value = r.choice(r.randint(10, 30), r.randint(50, 100))

print (value)

为什么它给我以下错误,我应该如何解决它?


TypeError: choice() takes 2 positional arguments but 3 were given 


婷婷同学_
浏览 85回答 2
2回答

尚方宝剑之说

choice需要一系列项目可供选择,而不是变量。包装参数以匿名或它将起作用,更改:tuplelistvalue = r.choice(r.randint(10, 30), r.randint(50, 100))更改为以下任一选项:value = r.choice((r.randint(10, 30), r.randint(50, 100)))  # Tuplevalue = r.choice([r.randint(10, 30), r.randint(50, 100)])  # List

陪伴而非守候

随机选择接受单个序列。关于如何生成所需的数字,您有几个选择。要修复即时错误,请将输入设置为序列:value = r.choice([r.randint(10, 30), r.randint(50, 100)])这不是一个很好的解决方案,因为它会生成两个数字,这是浪费的。此外,生成的分布以范围的大小为条件,这可能是不正确的。解决此问题的更一般方法是生成单个数字并将其映射到所需的范围:v = r.randint(0, 21 + 51)value = v + 10 if v <= 20 else v - 21 + 50如果要将输入指定为范围并在所有输入之间获得均匀分布,则可以像这样进行泛化:def from_ranges(*ranges):&nbsp; &nbsp; n = sum(map(len, ranges))&nbsp; &nbsp; v = random.randrange(n)&nbsp; &nbsp; for range in ranges:&nbsp; &nbsp; &nbsp; &nbsp; k = len(range)&nbsp; &nbsp; &nbsp; &nbsp; if v < k:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return range[v]&nbsp; &nbsp; &nbsp; &nbsp; v -= k这很好,因为范围是小对象,不占用太多空间,但在可以指定的内容方面允许您有很大的灵活性。对于您问题中的示例,您可以将该函数称为>>> from_ranges(range(10, 31), range(50, 101))您还可以通过将长度累积为累积总和来消除最终的线性搜索,以支持二进制搜索:from bisect import bisectfrom itertools import accumulatefrom random import randrangedef from_ranges(*ranges):&nbsp; &nbsp; lengths = list(accumulate(map(len, ranges)))&nbsp; &nbsp; v = randrange(lengths[-1])&nbsp; &nbsp; r = bisect(lengths, v)&nbsp; &nbsp; offset = lengths[r - 1] if r > 0 else 0&nbsp; &nbsp; return ranges[r][v - offset]如果要在生成随机数之前记住累积,则此解决方案会更快。否则,与第一种解决方案相比,它几乎没有优势。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python