Pergunta

Como faço para obter um decimal.Decimal exemplo aleatório? Parece que o módulo random só retorna carros alegóricos que são uma pita para converter em decimais.

Foi útil?

Solução

O que há de "um número decimal aleatório"? Decimais têm precisão arbitrária, gerando assim uma série com o máximo de aleatoriedade como você pode segurar em um Decimal levaria toda a memória da sua máquina para armazenar.

Você tem que saber quantos dígitos de precisão decimal você quer em seu número aleatório, em que ponto é fácil basta pegar um inteiro aleatório e dividi-lo. Por exemplo, se você quiser dois dígitos acima do ponto e dois dígitos na fração (ver randrange aqui ):

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

Outras dicas

A partir da padrão referência biblioteca:

Para criar um Decimal de um flutuador, primeiro convertê-lo para uma string. Isto serve como um lembrete explícito dos detalhes da conversão (incluindo erro de representação).

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

É isso que você quer dizer? Não parece como uma pita para mim. Você pode escalá-lo em qualquer faixa e precisão que você deseja.

Se você sabe quantos dígitos desejados antes e após a vírgula, você pode 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')
>>>

O módulo aleatório tem mais a oferecer do que "flutua única retornando", mas de qualquer maneira:

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

Ou eu perdi algo óbvio na sua pergunta?

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

No entanto, outra maneira de fazer um decimal aleatório.

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

Nesta exemplo,

  • random.randint () gera inteiro aleatório no intervalo especificado (inclusive),
  • random.random () gera número de ponto flutuante aleatório no intervalo (0.0, 1.0)
  • Finalmente, round () função irá arredondar o resultado da multiplicação dos valores multiplicação supracitado (algo longa como 254,71921934351644) para o número especificado depois do ponto decimal (no nosso caso, teríamos 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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top