четверг, 3 ноября 2011 г.

randdecimal

Понадобилось написать функцию которая будет отдавать случайный 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'е.

blog comments powered by Disqus