2016-05-09 7 views
0

[1,4]の範囲の4つの乱数を均一な分布で生成したいと考えています。たとえば、12の要素のシーケンスに対して、それぞれの数値が3回表示されます。一様分布で整数のシーケンスを生成するにはどうすればよいですか?

+10

それはランダムではありません:/ – linusg

+4

どのように定義する "出現eq ually "? [uniform distrubution](https://en.wikipedia.org/wiki/Uniform_distribution_%28discrete%29)を意味しますか? – gdlmx

+0

@ linusgおそらく、各要素が同じように表示される可能性がある、ランダムな順序で要素を持つ任意の長さのシーケンスを生成したいという問題です。私はA/Bテストで同様のものを使用しました。SMS Aを受け取るには、テスト全体で一定のパーセンテージの人が必要でしたが、テストに参加した人数は可変でした。あなたは私の答えを一例として見ることができます。いずれかの人のためのSMSの選択はランダム化されました。 – roganjosh

答えて

1

を使用して、はるかに容易になります

from random import randint 

def getNum1To4(runs): 
    occurences = {n+1:0 for n in range(4)} 
    for i in range(runs): 
     options = [n for n in occurences if occurences[n] < runs/4] 
     choice = options[randint(0, len(options) - 1)] 
     occurences[choice] += 1 
     yield choice 

出力:

>>> runs = 8 
>>> gen = getNum1To4(8) 
>>> for n in range(runs): print gen.next() 
2 
1 
3 
1 
3 
4 
4 
2 
0

このタスクのリストを使用すると、使用可能な番号のプールに重複が含まれないようにすることができます。私はあなたが12のリスト内のセットブロックに表示する必要があるかどうか、または完全にランダム化したいかどうかはわかりません。前者の場合は、最後のシャッフルを削除します。

from random import shuffle 

choice_pool = [x for x in range(1, 5)] 
random_output = [] 
number_of_runs = 4 

for x in range(number_of_runs): 
    shuffle(choice_pool) 
    random_output += choice_pool 

shuffle(random_output) 
print random_output 
0

このアプローチは動作するはずです:

import random 

foo = [i for i in range(1, 5)] * 4 
print random.sample(foo, len(foo)) 

出力:[2, 2, 3, 1, 4, 4, 3, 4, 1, 1, 3, 2, 1, 4, 3, 2]

0

これはあなたを助けるかもしれない -

import random 

def foo(number_of_runs, lower_limit, upper_limit): 
    turns = number_of_runs // (upper_limit - lower_limit + 1) 
    arr = list(range(lower_limit, upper_limit + 1)) * turns 
    random.shuffle(arr) 
    return arr 

print(foo(12, 1, 4)) 
0

import random 
x = [i for i in range(1, 5)] * 3 
random.shuffle(x) # shuffle the sequence x in place 

# Output 
[4, 3, 1, 3, 2, 2, 3, 4, 4, 1, 2, 1] 
、これを試してみてください

要素がfloatまたはdoubleであれば、答えはあなたが発電機を使用することができますnumpy.random.uniform

import numpy as np 
x = np.random.uniform(1, 5, 12) 

# Output 
array([ 4.18515267, 4.87403138, 3.43580119, 2.62828693, 3.77675348, 
     4.15627119, 4.02190688, 3.56667674, 1.31115154, 1.74971624, 
     3.20515834, 1.75240044]) 
関連する問題