将数字除以随机数的随机数?

时间:2012-04-24 20:09:49

标签: python math random integer-division

如果我需要将示例7除以随机大小的随机数元素,我该怎么做?

所以有时我会[3,4],有时[2,3,1],有时[2,2,1,1,0,1]?

我想这很简单,但我似乎无法得到结果。这是我试图以代码方式做的事情(不起作用):

def split_big_num(num):
    partition = randint(1,int(4))
    piece = randint(1,int(num))
    result = []
    for i in range(partition):
        element = num-piece
        result.append(element)
        piece = randint(0,element)
#What's next?
        if num - piece == 0:
            return result
    return result

编辑:每个结果数应小于初始数,零数应不小于分区数。

4 个答案:

答案 0 :(得分:12)

我会选择下一个:

>>> def decomposition(i):
        while i > 0:
            n = random.randint(1, i)
            yield n
            i -= n

>>> list(decomposition(7))
[2, 4, 1]
>>> list(decomposition(7))
[2, 1, 3, 1]
>>> list(decomposition(7))
[3, 1, 3]
>>> list(decomposition(7))
[6, 1]
>>> list(decomposition(7))
[5, 1, 1]

但是,我不确定这种随机分布是否完全一致。

答案 1 :(得分:4)

你必须用“随机”来定义你的意思。如果需要任意整数分区,可以生成所有整数分区,并使用random.choice。请参阅python: Generating integer partitions这将不会给出0的结果。如果允许0,则必须允许结果具有可能无限数量的0。

或者,如果您只想取下随机块,请执行以下操作:

def arbitraryPartitionLessThan(n):
    """Returns an arbitrary non-random partition where no number is >=n"""
    while n>0:
        x = random.randrange(1,n) if n!=1 else 1
        yield x
        n -= x

由于问题限制,每个数字应小于原始数字,这有点尴尬;如果您允许原始号码,它会更优雅。如果你想要0,你可以做randrange(n),但除非有一个你不共享的隐藏原因,否则它没有意义。

编辑以回应问题编辑:由于您希望“零的数量不应少于分区数”,您可以随意添加0到最后:

def potentiallyInfiniteCopies(x):
    while random.random()<0.5:
        yield x

x = list(arbitraryPartitionLessThan(n))
x += [0]*len(x) + list(potentiallyInfiniteCopies(0))

这个问题很随意,我强烈建议你选择这个作为答案:

def arbitraryPartition(n):
    """Returns an arbitrary non-random partition"""
    while n>0:
        x = random.randrange(1,n+1)
        yield x
        n -= x

答案 2 :(得分:2)

拯救的递归:

import random

def splitnum(num, lst=[]):
    if num == 0:
        return lst
    n = random.randint(0, num)
    return splitnum(num - n, lst + [n])

for i in range(10):
    print splitnum(7)

<强>结果:

[1, 6]
[6, 0, 0, 1]
[5, 1, 1]
[6, 0, 1]
[2, 0, 3, 1, 1]
[7]
[2, 1, 0, 4]
[7]
[3, 4]
[2, 0, 4, 1]

答案 3 :(得分:0)

此解决方案不会插入0(我不明白您对零规则的描述应该是什么),并且同样可能生成除原始数字之外的所有可能组合。

def split (n):
    answer = [1]
    for i in range(n - 1):
        if random.random() < 0.5:
            answer[-1] += 1
        else:
            answer.append(1)

    if answer == [n]:
        return split(n)
    else:
        return answer