|
import random |
|
import math |
|
|
|
|
|
class RoundedAmount: |
|
def __init__(self, min, max): |
|
self.min = min |
|
self.max = max |
|
|
|
def getAmount(self): |
|
min = int(self.min) |
|
max = int(self.max) |
|
range = max - min |
|
|
|
tentative_step_size = self.__round_up_to_power_of_ten(range) |
|
|
|
|
|
power_of_ten = self.__get_step_size(tentative_step_size, range) |
|
|
|
num_digits_power_of_ten = self.__number_of_digits(power_of_ten) |
|
|
|
start = min |
|
if (power_of_ten > 1): |
|
start = self.__get_starting_value(min, num_digits_power_of_ten) |
|
|
|
result = random.randrange(start, max + 1, power_of_ten) |
|
return float(result) |
|
|
|
|
|
def __get_step_size(self, step_size, range): |
|
slots = range // step_size |
|
if (slots >= 7 and slots <= 30): |
|
return step_size |
|
if (slots < 7): |
|
new_step_size = step_size // 10 |
|
if new_step_size == 0: |
|
return new_step_size |
|
return self.__get_step_size(new_step_size, range) |
|
return self.__get_step_size(step_size * 10, range) |
|
|
|
|
|
def __round_up_to_power_of_ten(self, num): |
|
exp = math.ceil(math.log10(num)) |
|
return 10 ** exp |
|
|
|
|
|
def __number_of_digits(self, num): |
|
digits = int(math.log10(num)) + 1 |
|
return digits |
|
|
|
|
|
def __get_starting_value(self, min, num_digits_stepsize): |
|
value = round(min, num_digits_stepsize * -1) |
|
if value < min: |
|
value += 10 ** (num_digits_stepsize - 1) |
|
return value |
|
|
|
|