Domanda

Come posso ottenere un decimal.Decimal istanza? Sembra che il modulo casuale restituisca solo float che sono una pita da convertire in decimali.

È stato utile?

Soluzione

Che cos'è un "decimale casuale"? I decimali hanno una precisione arbitraria, quindi generare un numero con la stessa casualità che puoi tenere in un decimale richiederebbe di memorizzare l'intera memoria della tua macchina.

Devi sapere quante cifre decimali di precisione vuoi nel tuo numero casuale, a quel punto è facile afferrare un intero casuale e dividerlo. Ad esempio, se si desidera due cifre sopra il punto e due cifre nella frazione (vedere randrange qui ):

decimal.Decimal(random.randrange(10000))/100

Altri suggerimenti

Dal riferimento alla libreria standard :

Per creare un decimale da un float, prima convertirlo in una stringa. Questo serve come promemoria esplicito dei dettagli della conversione (incluso errore di rappresentazione).

>>> import random, decimal
>>> decimal.Decimal(str(random.random()))
Decimal('0.467474014342')

È questo che intendi? Non mi sembra una pita. Puoi ridimensionarlo in qualsiasi intervallo e precisione desideri.

Se sai quante cifre vuoi dopo e prima della virgola, puoi usare:

>>> import decimal
>>> import random
>>> def gen_random_decimal(i,d):
...  return decimal.Decimal('%d.%d' % (random.randint(0,i),random.randint(0,d)))

...
>>> gen_random_decimal(9999,999999) #4 digits before, 6 after
Decimal('4262.786648')
>>> gen_random_decimal(9999,999999)
Decimal('8623.79391')
>>> gen_random_decimal(9999,999999)
Decimal('7706.492775')
>>> gen_random_decimal(99999999999,999999999999) #11 digits before, 12 after
Decimal('35018421976.794013996282')
>>>

Il modulo casuale ha più da offrire di "solo restituire float", ma comunque:

from random import random
from decimal import Decimal
randdecimal = lambda: Decimal("%f" % random.random())

O mi sono perso qualcosa di ovvio nella tua domanda?

decimal.Decimal(random.random() * MAX_VAL).quantize(decimal.Decimal('.01'))

Ancora un altro modo per fare un decimale casuale.

import random
round(random.randint(1, 1000) * random.random(), 2)

In questo esempio,

  • random.randint () genera numeri interi casuali nell'intervallo specificato (inclusivamente),
  • random.random () genera un numero a virgola mobile casuale nell'intervallo (0.0, 1.0)
  • Infine, la funzione round () arrotonderà il risultato della moltiplicazione della moltiplicazione dei valori sopra menzionata (qualcosa come 254.71921934351644) al numero specificato dopo il punto decimale (nel nostro caso avremmo 254,71)
import random
y = eval(input("Enter the value of y for the range of random number : "))
x = round(y*random.random(),2)  #only for 2 round off 
print(x)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top