109
  • この質問は、次の理由により 、合計が M である N 個の乱数を取得するの複製ではありません。
    1. そこにあるほとんどの答えは理論に関するものであり、この質問に答えるためのPythonの特定のコーディングソリューションではありません
    2. ここで受け入れられた回答は、この質問に回答する複製の 1 つの回答よりも 5 歳古いです。
    3. 重複して受け入れられた回答は、この質問には答えません

合計が 1 になるように、N 個 (たとえば 100 個) の乱数のリストを作成するにはどうすればよいでしょうか?

乱数のリストを作成できます

r = [ran.random() for i in range(1,100)]

リストの合計が 1 になるようにこれを変更するにはどうすればよいでしょうか (これは確率シミュレーション用です)。

4

11 に答える 11

6

0 と 1 からなるリストを作成し、99 個の乱数を追加します。リストを並べ替えます。連続する差は、合計が 1 になる間隔の長さになります。

私はPythonに堪能ではないので、これを行うためのよりPython的な方法があれば許してください。ただし、意図が明確であることを願っています。

import random

values = [0.0, 1.0]
for i in range(99):
    values.append(random.random())
values.sort()
results = []
for i in range(1,101):
    results.append(values[i] - values[i-1])
print results

Python 3 での更新された実装を次に示します。

import random

def sum_to_one(n):
    values = [0.0, 1.0] + [random.random() for _ in range(n - 1)]
    values.sort()
    return [values[i+1] - values[i] for i in range(n)]

print(sum_to_one(100))
于 2013-09-06T16:18:06.663 に答える
0

「リスト内の各要素をリストの合計で割る」という精神で、この定義は長さ = PARTS、合計 = TOTAL の乱数のリストを作成し、各要素は PLACES (または None) に丸められます。

import random
import time

PARTS       = 5
TOTAL       = 10
PLACES      = 3

def random_sum_split(parts, total, places):

    a = []
    for n in range(parts):
        a.append(random.random())
    b = sum(a)
    c = [x/b for x in a]    
    d = sum(c)
    e = c
    if places != None:
        e = [round(x*total, places) for x in c]
    f = e[-(parts-1):]
    g = total - sum(f)
    if places != None:
        g = round(g, places)
    f.insert(0, g)

    log(a)
    log(b)
    log(c)
    log(d)
    log(e)
    log(f)
    log(g)

    return f   

def tick():

    if info.tick == 1:

        start = time.time()

        alpha = random_sum_split(PARTS, TOTAL, PLACES)

        log('********************')
        log('***** RESULTS ******')
        log('alpha: %s' % alpha)
        log('total: %.7f' % sum(alpha))
        log('parts: %s' % PARTS)
        log('places: %s' % PLACES)

        end = time.time()  

        log('elapsed: %.7f' % (end-start))

結果:

Waiting...
Saved successfully.
[2014-06-13 00:01:00] [0.33561018369775897, 0.4904215932650632, 0.20264927800402832, 0.118862130636748, 0.03107818050878819]
[2014-06-13 00:01:00] 1.17862136611
[2014-06-13 00:01:00] [0.28474809073311597, 0.41609766067850096, 0.17193755673414868, 0.10084844382959707, 0.02636824802463724]
[2014-06-13 00:01:00] 1.0
[2014-06-13 00:01:00] [2.847, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] [2.848, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] 2.848
[2014-06-13 00:01:00] ********************
[2014-06-13 00:01:00] ***** RESULTS ******
[2014-06-13 00:01:00] alpha: [2.848, 4.161, 1.719, 1.008, 0.264]
[2014-06-13 00:01:00] total: 10.0000000
[2014-06-13 00:01:00] parts: 5
[2014-06-13 00:01:00] places: 3
[2014-06-13 00:01:00] elapsed: 0.0054131
于 2014-09-04T18:51:13.690 に答える
0

あなたは簡単に行うことができます:

r.append(1 - sum(r))
于 2013-09-06T14:13:07.303 に答える
0

pjsの方法の精神で:

a = [0, total] + [random.random()*total for i in range(parts-1)]
a.sort()
b = [(a[i] - a[i-1]) for i in range(1, (parts+1))]

小数点以下を四捨五入したい場合:

if places == None:
    return b
else:    
    b.pop()
    c = [round(x, places) for x in b]  
    c.append(round(total-sum(c), places))
    return c
于 2014-09-05T02:18:57.137 に答える