簡體   English   中英

如何拒絕python中的隨機數?

[英]how do I reject random numbers in python?

我嘗試構建彩票號碼生成器,但是我不知道如何使隨機模塊重播已生成的號碼或屬於列表的號碼。 因此,基本上,我希望不再生成oldNumbers中的數字。 抱歉,如果我不夠明確,但是我將代碼留在這里。 謝謝

import random

oldNumbers = [5, 11, 19, 20, 38]

ball1 = random.randint(1, 39)
ball2 = random.randint(1, 39)
ball3 = random.randint(1, 39)
ball4 = random.randint(1, 39)
ball5 = random.randint(1, 39)

print(ball1, ball2, ball3, ball4, ball5)

這是一個簡單的解決方案:

print(random.sample([i for i in range(1, 39) if i not in oldNumbers], 5))

或者您可以簡單地使用set減法:

print(random.sample(set(range(1, 39)) - set(oldNumbers), 5))

有兩種簡單的方法。 第一個是兩次嘗試多次隨機數並拒絕列表中的那些

import random
oldNumbers = [5, 11, 19, 20, 38]
for i in range(5):
    ball=random.randint(1, 39)
    while ball in oldNumbers:
        print('Rejected:',ball)
        ball = random.randint(1, 39)
    print(oldNumbers,ball)
    oldNumbers+=[ball]

另一種方法是僅從包含所需數字的列表中選擇隨機數字。

import random
oldNumbers = [5, 11, 19, 20, 38]
for i in range(5):
    newNumbers = [i for i in range(1,39) if i not in oldNumbers]
    ball=random.choice(newNumbers)
    print(oldNumbers,ball)
    oldNumbers+=[ball]

Selcuk的答案是解決您問題的最佳方法,但是我認為我會提供一種替代方法,當range很大且oldNumbers不太大時,該方法將更加有效。

from itertools import islice
from random import sample

forbidden = set(oldNumbers)

numneeded = 5

# Might have old numbers in it, but definitely has at least 5 new numbers
numbers = random.sample(range(1, 39), numneeded + len(forbidden))

# Generates only the new numbers
notForbidden = (num for num in numbers if num not in forbidden)

# Keep only as many as you need
newNumbers = list(islice(notForbidden, numneeded))

除了導入之外,所有這些都可以是newNumbers = list(islice(filterfalse(set(forbidden).__contains__, random.sample(range(1, 39), 10)), 5))newNumbers = list(islice(filterfalse(set(forbidden).__contains__, random.sample(range(1, 39), 10)), 5)) )但我拆分以進行說明。

這樣做的好處是不需要構造一個經過過濾的list來傳遞給sample ,如果range變大,可能會成為運行時間/內存問題。 相反,您只需生成足夠的數字,就可以確保至少生成了所需的數量,即使您碰巧選擇了所有禁止的數字,然后僅保留所需的數量即可。

其中Selcuk的答案是O(n)range的大小,此答案是O(n) ,即您需要生成的數字數加上要排除的數字(為了確定,該數字應始終小於range的大小原因)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM