2016-08-23 9 views
-2

k桁のn個の乱数を作成する方法はありますか?例えばk桁のn個の乱数を生成する方法

... [0, 2, 3]

私のトリックを備えた2000のランダムな整数は、発電機の乱数を使用して、範囲に基づいて値を割り当てることでしたか?

しかし、これをPythonで行うより良い方法があるのだろうかと疑問に思っていましたか?

編集: 例:[0,0,0、2、2,3,0,0,2,2、... 2000個の要素] 0,2を含み、3 私のアプローチ

def assign(x): 
     if x< 0.3: return 0 
     elif x<0.6: return 2 
     else: return 3 

    x = np.random.rand(num) 

    x = map(lamdba x:assign(x),x) 
+0

これは、最初のいくつかの統計モデルを必要とします。または、数字2と比較して10^7桁の数字が等しくなる可能性がありますか? – sascha

+4

あなたの質問を改善してください:1.希望の出力を追加してください。 2.これまでに試したことをコードで説明してください。ゴールドオジャーからのこのような貧しい質問を見ることは非常に奇妙です。 –

+0

例を挙げることができますか?あなたは 'n'個の整数を生成しようとしていますか?それぞれが2、3、または0であり、等しい重みを持ちますか? –

答えて

3

リストk内で見つかった値のみを使用して長さnのシーケンスを生成するように、それが見えます。

Pythonのrandom.choice機能とリストの解説がこれに最適です。

次の関数は、各要素がkから選択されたランダム要素である長さnのリストを生成します。

from random import choice 

def random_choices(n, k): 
    return [choice(k) for _ in xrange(n)] 

ここでは、単純なリストの理解と同じです。

from random import choice 
foo = [choice(k) for _ in xrange(n)] 

* xrangeはPythonの3.x.x.にrangeに交換する必要があることを指摘しMr.goosberryに感謝

+2

これはOPが望んでいることは明らかではないし、何の説明もなくても、これは素晴らしい答えではない。 –

+1

@AdamSmith申し訳ありませんが、私は答えることができた質問を見つけることに興奮していました。他の人の前に答えを書きたいと思っていました; D – Billylegota

+1

西の最速の銃は本当のことですが、その衝動と戦いましょう;-) –

1

あなたの編集後、あなたが望むものが明確になります。あるコンテナ内のいくつかの要素を離散サンプリングする必要があります。

ちょうどあなたのクラスを用意し、これを実行します。あなたには、いくつかの特定の確率たい場合

import numpy as np 
classes = [0, 2, 3] 
samples = np.random.choice(classes, 2000) 

を:

import numpy as np 
classes = [0, 2, 3] 
samples = np.random.choice(classes, 2000, p=[0.3, 0.3, 0.4]) 

docsを参照してください。

実装は、ルーレットホイールサンプリングまたはリニアサーチサンプリングと呼ばれることもありますが、アプローチよりもはるかに高速でなければなりません。 wikiにはいくつかの可能なアルゴリズムが記載されています。

1

あなたはlist comprehensionによって達成することができます。結果を表示するために私は20を使用しています。要件に応じて2000に変更してください。それの音から

>>> import random 
>>> x = 20 
>>> [random.choice([0, 2, 3]) for i in range(20)] 
[2, 2, 3, 2, 0, 2, 3, 2, 3, 3, 3, 0, 3, 2, 3, 2, 3, 2, 3, 2] 
+0

私はこれがOPが望んでいることを完全には確信していません... –

+0

@AdamSmithどのようにそうですか?ちょっと興味があるんだけど。 –

+1

@AdamSmithがあなたを手に入れました。 –

1

あなたはnumpyのを使用して喜んでいるので、私はつまり、あなたがnp.random.choiceを使用することをお勧めしたい:

import numpy as np 

N = 2000 
print[np.random.choice([0, 2, 3], p=[1/3.0, 1/3.0, 1/3.0]) for x in range(N)] 
+0

いいえ冗長性:-) – sascha

+0

@sascha Lol、私たちは同時に投稿し、3つの値に1/3の確率を与える方法を見つけませんでした...それらは合計しません1 – BPL

+0

何をしています..あなたが均一なサンプリングをしたいなら、p(= None)を設定しないでください! (そしてあなたが夢中なら、 '' 'p = [1/3.0,1/3.0,1/3.0]' ''を使ってください)。 – sascha

0
import numpy as np 
N = 10 
# Generate three vectors of n size 
zeros = np.zeros((N,), dtype = np.int) 
twos = np.zeros((N,), dtype = np.int) + 2 
threes = np.zeros((N,), dtype = np.int) + 3 
# Permutate all together 
df = [] 
df = np.append(df, [zeros, twos, threes]) 
df_shuffled = np.random.shuffle(df) 
print(df) 
関連する問題