float - Decimal al azar en python
random.uniform python (5)
¿Cómo obtengo un decimal aleatorio.Decimal? Parece que el módulo aleatorio solo devuelve flotantes que son una pita para convertir a decimales.
De la referencia de la biblioteca estándar :
Para crear un decimal de un flotante, primero conviértalo en una cadena. Esto sirve como un recordatorio explícito de los detalles de la conversión (incluido el error de representación).
>>> import random, decimal
>>> decimal.Decimal(str(random.random()))
Decimal(''0.467474014342'')
¿Es esto lo que quieres decir? No me parece una pita. Puede escalarlo en cualquier rango y precisión que desee.
El módulo aleatorio tiene más que ofrecer que "solo devuelve carrozas", pero de todos modos:
from random import random
from decimal import Decimal
randdecimal = lambda: Decimal("%f" % random.random())
¿O me perdí algo obvio en tu pregunta?
Si sabe cuántos dígitos quiere después y después de la coma, puede usar:
>>> 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'')
>>>
decimal.Decimal(random.random() * MAX_VAL).quantize(decimal.Decimal(''.01''))
¿Qué es "un decimal aleatorio"? Los decimales tienen una precisión arbitraria, por lo que generar un número con tanta aleatoriedad como puedas guardar en un decimal llevaría a almacenar toda la memoria de tu máquina.
Debe saber cuántos dígitos decimales de precisión desea en su número aleatorio, momento en el cual es fácil obtener un entero aleatorio y dividirlo. Por ejemplo, si quiere dos dígitos sobre el punto y dos dígitos en la fracción (vea randrange aquí ):
decimal.Decimal(random.randrange(10000))/100