случайный десятичный в питоне - PullRequest
11 голосов
/ 13 января 2009

Как получить случайный decimal.Decimal экземпляр? Похоже, что случайный модуль возвращает только числа с плавающей запятой, которые являются pita для преобразования в десятичные числа.

Ответы [ 7 ]

27 голосов
/ 13 января 2009

Что такое "случайный десятичный знак"? Десятичные числа имеют произвольную точность, поэтому для генерации числа с такой степенью случайности, которое вы можете хранить в десятичном формате, потребуется вся память вашей машины для хранения.

Вы должны знать, сколько десятичных разрядов точности вы хотите получить в своем случайном числе, и в этот момент легко просто получить случайное целое число и разделить его. Например, если вам нужно две цифры над точкой и две цифры в дроби (см. randrange здесь ):

decimal.Decimal(random.randrange(10000))/100
15 голосов
/ 13 января 2009

Из ссылки на стандартную библиотеку :

Чтобы создать десятичное число из числа с плавающей запятой, сначала преобразуйте его в строку. Это служит явным напоминанием о деталях преобразования (включая ошибку представления).

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

Это то, что вы имеете в виду? Это не похоже на лаваш. Вы можете масштабировать его в любом диапазоне и точности по вашему желанию.

8 голосов
/ 13 января 2009

Если вы знаете, сколько цифр вы хотите после и до запятой, вы можете использовать:

>>> 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')
>>>
2 голосов
/ 07 мая 2012
decimal.Decimal(random.random() * MAX_VAL).quantize(decimal.Decimal('.01'))
2 голосов
/ 13 января 2009

Случайный модуль может предложить больше, чем «только возвращаемые числа», но в любом случае:

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

Или я упустил что-то очевидное в вашем вопросе?

0 голосов
/ 04 апреля 2018
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)
0 голосов
/ 26 февраля 2018

Еще один способ сделать случайную десятичную.

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

В этом примере

  • random.randint () генерирует случайное целое число в указанном диапазоне (включительно),
  • random.random () генерирует случайное число с плавающей запятой в диапазоне (0,0, 1,0)
  • Наконец, функция round () округляет результат умножения вышеупомянутых умножений значений (что-то вроде 254.71921934351644) до указанного числа после десятичной точки (в нашем случае мы получили бы 254.71)
...