将十进制数拆分为随机数组,其中数字的总和等于拆分数

时间:2018-01-29 14:22:38

标签: python decimal

我想将一个十进制数拆分成一个随机表,其中数组中元素的总和等于原始数

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

3 个答案:

答案 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')]