亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 2 個范圍中獲取 1 個數字,其中包含選擇()和蘭丁()

我有一個代碼塊import random as rvalue = r.choice(r.randint(10, 30), r.randint(50, 100))print (value)為什么它給我以下錯誤,我應該如何解決它?TypeError: choice() takes 2 positional arguments but 3 were given 
查看完整描述

2 回答

?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

choice需要一系列項目可供選擇,而不是變量。包裝參數以匿名或它將起作用,更改:tuplelist


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

更改為以下任一選項:


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

value = r.choice([r.randint(10, 30), r.randint(50, 100)])  # List


查看完整回答
反對 回復 2022-09-27
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

隨機選擇接受單個序列。關于如何生成所需的數字,您有幾個選擇。


要修復即時錯誤,請將輸入設置為序列:


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):

    n = sum(map(len, ranges))

    v = random.randrange(n)

    for range in ranges:

        k = len(range)

        if v < k:

            return range[v]

        v -= k

這很好,因為范圍是小對象,不占用太多空間,但在可以指定的內容方面允許您有很大的靈活性。


對于您問題中的示例,您可以將該函數稱為


>>> from_ranges(range(10, 31), range(50, 101))

您還可以通過將長度累積為累積總和來消除最終的線性搜索,以支持二進制搜索:


from bisect import bisect

from itertools import accumulate

from random import randrange


def from_ranges(*ranges):

    lengths = list(accumulate(map(len, ranges)))

    v = randrange(lengths[-1])

    r = bisect(lengths, v)

    offset = lengths[r - 1] if r > 0 else 0

    return ranges[r][v - offset]

如果要在生成隨機數之前記住累積,則此解決方案會更快。否則,與第一種解決方案相比,它幾乎沒有優勢。


查看完整回答
反對 回復 2022-09-27
  • 2 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號