[Python] come ottenere numeri dispari casuali in un intervallo dato

Stefano Dal Pra s.dalpra a gmail.com
Mar 5 Gen 2010 13:01:56 CET


2010/1/5 Enrico Franchi <enrico.franchi a gmail.com>:
>
> On Jan 5, 2010, at 11:35 AM, Stefano Dal Pra wrote:
>
>> Propongo anche questa variante:
>>
>> import random
>> random.randint(0,9) | 1
>>
>> il | 1 setta a uno il bit meno significativo, rendendolo dispari se non lo e'.
>> E' importante che gli estremi passati a randint siano: pari quello inferiore
>> e dispari quello superiore, altrimenti i risultati non sarebbero tutti
>> equiprobabili.
>

> Perche' giocare con i bit quando Python offre direttamente costrutti con la semantica voluta?

Perche' quella e' pura e semplice sintassi python, quindi legittima.
Poi per motivi di efficienza:
l'interprete, se non e' scemo, dovrebbe tradurre il | 1 con una
singola istruzione macchina (or bit a bit). Se  devi generare un
dispari e via, ok. Se ne devi fare moltissimi e piu' rapidamente
possibile, il discorso cambia.

Per non giocare con i bit uno puo' fare randint(0,4) * 2 + 1 e ottiene
i dispari tra 1 e 9, tanto equiprobabili quanto randint(0,4).
Nel caso di randint(0,9) | 1 , ogni risultato ha esattamente due
possibilita' di uscire: era il pari immediatamente superiore a cui si
e' aggiunto 1, oppure era direttamente dispari, e non e' cambiato.

Stefano



>
> Per inciso, trasformare numeri pseudo-casuali e' in generale un'operazione piuttosto rischiosa, in quanto si puo' andare ad influire negativamente sulla qualita' della sequenza generata. Nell'esempio probabilmente non ci sono problemi, visto che il generatore sotto Python e' un Mersenne Twister di altissima qualita' e "dovrebbe" reggere bene ad una cosa del genere. *Ma* ci vorrebbe una qualche dimostrazione.
>
> Ora, nel caso probabilmente non interessa. Tuttavia *in genere* le sequenze pseudo-casuali sono bestie abbastanza delicate.
>
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>


Maggiori informazioni sulla lista Python