float python random decimal

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