Понадобилось написать функцию которая будет отдавать случайный Decimal
между значениями a
и b
(аналогично для встроенной random.randint
, только с поддержкой Decimal
). Получилось все довольно просто:
from decimal import Decimal
from random import randint
def randdecimal(a, b):
"""
Return a random decimal N such that a <= N <= b.
"""
a, b = Decimal(a), Decimal(b)
diff = b - a
multiplier = pow(10, abs(diff.as_tuple()[2]))
diff_to_int = int(diff * multiplier)
return a + Decimal(randint(0, diff_to_int)) / multiplier
Результат работы:
In [3]: from randdecimal import randdecimal
In [4]: randdecimal(0, 10)
Out[4]: Decimal('5')
In [5]: randdecimal(0, 10)
Out[5]: Decimal('1')
In [6]: randdecimal(0, 10)
Out[6]: Decimal('1')
In [7]: randdecimal('0.13', '0.20')
Out[7]: Decimal('0.20')
In [8]: randdecimal('0.13', '0.20')
Out[8]: Decimal('0.14')
In [9]: randdecimal('0.13', '0.20')
Out[9]: Decimal('0.15')
In [10]: randdecimal('0.135', '0.2')
Out[10]: Decimal('0.139')
In [11]: randdecimal('0.135', '0.2')
Out[11]: Decimal('0.194')
In [12]: randdecimal('0.135', '0.2')
Out[12]: Decimal('0.172')
In [13]: randdecimal('0.135', '0.2')
Out[13]: Decimal('0.182')
In [14]: from decimal import Decimal
In [15]: randdecimal(Decimal('5.34'), 10)
Out[15]: Decimal('8.69')
In [16]: randdecimal(Decimal('5.34'), 10)
Out[16]: Decimal('9.17')
In [17]: randdecimal(Decimal('5.34'), 10)
Out[17]: Decimal('6.34')
In [18]: randdecimal(0, Decimal('5.33'))
Out[18]: Decimal('2.66')
In [19]: randdecimal(0, Decimal('5.33'))
Out[19]: Decimal('2')
In [20]: randdecimal(0, Decimal('5.33'))
Out[20]: Decimal('3.21')
Полностью randdecimal.py вместе с тестами доступен как gist на GitHub'е.