2012-04-24 9 views
2

例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 

EDIT:結果の数字はそれぞれ、初期数未満でなければならないとゼロの数は、パーティションの数よりも少なくないはずです。

+0

ランダムな要素の数を指定します。サブセットのすべての長さが同じ確率で選択されていることを意味しますか?または、すべてのサブセットが選択される確率が同じであることを意味しますか?それらは非常に異なるものを意味します。 –

+2

[7]それを返すべきでしょうか? [0,0,0,0,0,7]はどうですか?彼らは可能ですか? – DanRedux

+0

申し訳ありませんが、私はそれを明確にしなければなりませんでした。 – Stpn

答えて

9

は、私は次のために行くだろう:

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

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

+0

素晴らしいです!どうもありがとう!私はSOが許す限り、これを答えとして受け入れます。 – Stpn

+0

ニースの答え!マイナーポイント: 'n = rn.randint(0、i)'を使用すると、Stpnが望むゼロが許されます。 – Akavall

+0

@Akavall:また、多くの0を累積することができます。 –

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 
+0

組成の数が急激に増加します。したがって、nの適度な値でさえ、あなたの記憶をすべて使い果たす可能性があります。 – btilly

+0

このような徹底的な対応をお寄せいただきありがとうございます – Stpn

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

[1,1,1,1,1,1,1]はどこですか? –

+0

@AshwiniChaudhary:返されるシーケンスのオッズを計算し、あなたの答えがあります。 – geoffspear

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 
関連する問題