| 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 |
| |
|
|