Python può generare un numero casuale che esclude un insieme di numeri, senza usare la ricorsione?

2022-07-29 16:00:06

Ho esaminato Python Docs (potrei aver frainteso), ma non ho visto che c'era un modo per farlo (guarda sotto) senza chiamare una funzione ricorsiva.
Quello che vorrei fare è generare un valore casuale che esclude i valori nel mezzo.

In altre parole,
Immaginiamo che io voglia che X sia un numero casuale che non è in
range(a - b, a + b)
Posso farlo al primo passaggio,
o
1. Devo generare costantemente un numero,
2. Verifica se in range(),
3. Lavare risciacquare?

Per quanto riguarda il motivo per cui non desidero scrivere una funzione ricorsiva,
1. "sembra" che non dovrei
2. l'insieme di numeri per cui lo sto facendo potrebbe effettivamente risultare piuttosto grande e
... Ho sentito che gli overflow dello stack sono negativi e potrei semplicemente essere eccessivamente cauto nel farlo.

Sono sicuro che esiste un modo carino, Pythonico e non ricorsivo per farlo.

- user890167

Source
Risposta


32
  • Usa random.choice(). In questo esempio, a è il tuo limite inferiore, l'intervallo tra b e c viene saltato e d è il tuo limite superiore.

    import random
    numbers = range(a,b) + range(c,d)
    r = random.choice(numbers)