5

たとえば 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

4 に答える 4

14

私は次に行きます:

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

ただし、このランダムな分布が完全に均一であるかどうかはわかりません。

于 2012-04-24T20:19:03.277 に答える
4

「ランダム」の意味を定義する必要があります。任意の整数分割が必要な場合は、すべての整数分割を生成し、 を使用できますrandom.choicepython: 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
于 2012-04-24T20:15:09.130 に答える
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]
于 2012-04-24T20:20:02.810 に答える
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
于 2012-04-24T22:02:23.397 に答える