我想将一个十进制数拆分成一个随机表,其中数组中元素的总和等于原始数
# Call a function which receives a decimal number
from decimal import Decimal
from something import split_random_decimal
split_decimal = split_random_decimal(Decimal('10.00'))
print(split_decimal)
# Output: [1.3, 0.7, 1.2, 0.8, 1.0, 1.5, 0.5, 1.9, 0.1, 1.0]
print(sum(split_decimal))
# Output: Decimal('10.00') - The original decimal value
有没有人知道如何在不使用库的情况下在纯Python中执行此操作?
解决!
对所有帮助过我的人来说,保存我生命的最后美丽代码是:
import random
def random_by_number(number, min_random, max_random, spaces=1, precision=2):
if spaces <= 0:
return number
random_numbers = [random.uniform(min_random, max_random) for i in range(0, spaces)]
increment_number = (number - sum(random_numbers)) / spaces
return [round(n + increment_number, precision) for n in random_numbers]
number = 2500.50
spaces = 30
max_random = number / spaces
min_random = max_random * 0.6
random_numbers = random_by_number(number, min_random, max_random, spaces=spaces, precision=2)
print(random_numbers)
print(len(random_numbers))
print(sum(random_numbers))
答案 0 :(得分:0)
当人们要求别人只是编写他们的问题时,这个社区讨厌。既然你是新人,我会给你一些懈怠,并给你一些路径。
您可以从以下内容开始:
numberLeft = 10.0
decList = list()
while numberLeft > 0:
cur = random.uniform(0, numberLeft)
decList.append(cur)
numberLeft -= cur
这种实现首先会选择更高的随机数,这在逻辑上很难改变。 numberLeft永远不会命中0,所以你可以做一些舍入。您还可以等待numberLeft变得足够低,这将是列表中的最后一个随机数。
希望这有助于你开始
答案 1 :(得分:0)
正如Hiding所说社区确实对大多数代码问题和答案都不满意,当你提出问题时也要小心你的拼写。如果提问者犯了很多拼写错误,那就表明他们并不在乎花时间来制定他们的问题,但是他们要求人们把时间花在回答上。
无论如何,我认为这就是你要找的东西:
import random as r
def random_sum_to(n, num_terms = None):
n = n*100
num_terms = (num_terms or r.randint(2, n)) - 1
a = r.sample(range(1, n), num_terms) + [0, n]
list.sort(a)
return [(a[i+1] - a[i])/100.00 for i in range(len(a) - 1)]
print(random_sum_to(20, 3)) # [8.11, 3.21, 8.68] example
print(random_sum_to(20, 5)) # [5.21, 7.57, 0.43, 3.83, 2.96] example
print(random_sum_to(20)) # [1 ,2 ,1 ,4, 4, 2, 2, 1, 3] example
n是求和的数字,num_terms是您希望的结果字符串的长度。另外,如果你看一下最后一个例子,你可以看到,如果你不想指定一个“num_terms”,你就不必这样做了,它会为你做到这一点!
如果您有任何问题请告诉我,请尽量在下次制定更好的问题,以免损害您的声誉。
答案 2 :(得分:0)
这个问题有点不明确:它应该拆分多少件,任何一块有多大?价值应该只是积极的吗?你所说的近似解决方案是挑选一个随机数量的碎片(默认为10)并使这些值正常分布在碎片的平均尺寸上,标准偏差为平均值的1/10: / p>
from decimal import Decimal
def split_random_decimal(x, n=10):
assert n > 0
if n == 1:
return [x]
from random import gauss
mu = float(x)/n
s = mu/10
if '.' in str(x):
p = len(str(x)) - str(x).find('.') - 1
else:
p = 0
rv = [Decimal(str(round(gauss(mu, s), p))) for i in range(n-1)]
rv.append(x - sum(rv))
return rv
>>> splited_decimal = split_random_decimal(Decimal('10.00'))
>>> print(splited_decimal)
[Decimal('0.84'), Decimal('1.08'), Decimal('0.85'), Decimal('1.04'),
Decimal('0.96'), Decimal('1.2'), Decimal('0.9'), Decimal('1.09'),
Decimal('1.08'), Decimal('0.96')]