View Full Version : [Python] Generare valori casuali
Heretic Curse
12-04-2013, 16:13
Mi servirebbe scrivere una funzione che, dati due valori, restituisca valori casuali compresi fra questi due.
Questo è ciò che ho scritto:
def Rand(x, y):
r = random.random()*((x/random.random()+(y/random.random()))
while r<x or r>y:
r = random.random()*((x/random.random()+(y/random.random()))
print r
Già così funziona, pure gli estremi sono sempre teoricamente ottenibili (ammesso che abbia ben eseguito i miei calcoli). Tuttavia, se metto due estremi molto ravvicinati, ad esempio 0 e 0.0000000004, la funzione si blocca, scompare il ">>>" dal compilatore e non posso più fare nulla :muro:
Qualche soluzione o spiegazione?
Mi servirebbe scrivere una funzione che, dati due valori, restituisca valori casuali compresi fra questi due.
Questo è ciò che ho scritto:
def Rand(x, y):
r = random.random()*((x/random.random()+(y/random.random()))
while r<x or r>y:
r = random.random()*((x/random.random()+(y/random.random()))
print r
Già così funziona, pure gli estremi sono sempre teoricamente ottenibili (ammesso che abbia ben eseguito i miei calcoli). Tuttavia, se metto due estremi molto ravvicinati, ad esempio 0 e 0.0000000004, la funzione si blocca, scompare il ">>>" dal compilatore e non posso più fare nulla :muro:
Qualche soluzione o spiegazione?
Probabilmente l'interprete è in un ciclo quasi-infinito in attesa che il numero generato rispetti i criteri desiderati.
Io genererei un singolo numero casuale e poi lo utilizzerei per scegliere un valore all'interno del range richiesto.
Heretic Curse
12-04-2013, 18:02
Probabilmente l'interprete è in un ciclo quasi-infinito in attesa che il numero generato rispetti i criteri desiderati.
Io genererei un singolo numero casuale e poi lo utilizzerei per scegliere un valore all'interno del range richiesto.
ok grazie ;)
Mi servirebbe scrivere una funzione che, dati due valori, restituisca valori casuali compresi fra questi due.
Questo è ciò che ho scritto:
def Rand(x, y):
r = random.random()*((x/random.random()+(y/random.random()))
while r<x or r>y:
r = random.random()*((x/random.random()+(y/random.random()))
print r
Già così funziona, pure gli estremi sono sempre teoricamente ottenibili (ammesso che abbia ben eseguito i miei calcoli). Tuttavia, se metto due estremi molto ravvicinati, ad esempio 0 e 0.0000000004, la funzione si blocca, scompare il ">>>" dal compilatore e non posso più fare nulla :muro:
Qualche soluzione o spiegazione?
Puoi costruire matematicamente ciò che ti serve, senza ricorrere ad un ciclo, in particolare:
def Rand(x, y):
return x + (y-x)*random.random()
In pratica prendi x come base da cui partire, e poi sommi (y-x) pesata con random() che è un numero da 0 a 1.
Nei due casi estremi avresti:
x + (y-x) * 0 = x
x + (y-x) * 1 = x + y - x = y
PS: ho appena notato che Python ha anche un metodo random.randint(a, b) che fa al caso tuo, se il tuo obiettivo è generare numeri interi compresi in un intervallo.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.