python разделить число на несколько не равных частей
Как разделить число на несколько не равных частей?
Например:
есть 10, надо разделить на 5 частей.
выводится [4, 1.5, 2.25, 2, 0.25]
Ответы (3 шт):
Вот быстрый набросок, думаю разберётесь, как допилить для ваших целей.
import random
def random_split_number(number, split_count=4, digits=2):
copy_number = number
split_number_list = []
for i in range(split_count - 1):
divider = random.randint(2, number // 2)
copy_number = round(copy_number / divider, digits)
split_number_list.append(copy_number)
last_split_number = number - sum(split_number_list)
split_number_list.append(last_split_number)
return split_number_list
result = random_split_number(10)
print(result, sum(result))
Без рандома: делим число на две части в какой-то пропорции (не на равные части, иначе две последние части будут равными), вторую часть еще на две части, и так пока не получится нужное количество частей.
def split_number(number, parts: int):
result = []
for i in range(parts-1):
part = number / 4
number = number - part
result.append(part)
result.append(number)
return result
print(split_number(100, 7))
Вывод:
[25.0, 18.75, 14.0625, 10.546875, 7.91015625, 5.9326171875, 17.7978515625]
Но при отделении 1/4 последняя часть получается довольно большой, есть вероятность что она совпадет с какой-то из предыдущих частей.
В идеале нужно подобрать коэффициент так, чтобы две последние части были не равны, и были меньше предыдущих частей. Например, что-то такое:
part = number * 0.45
Результат будет такой:
[45.0, 24.75, 13.6125, 7.4868749999999995, 4.11778125, 2.2647796875, 2.7680640624999997]
import random
def divide(value, parts):
res = [random.random() for _ in range(parts)]
coef = value / sum(res)
return [x*coef for x in res]
print(divide(10, 4))