PDA

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?

GByTe87
12-04-2013, 16:53
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 ;)

WarDuck
12-04-2013, 20:44
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.