2017-01-28 5 views
1

私は、半径が3.5で内半径が2のリング内でランダムなx座標とy座標を生成しようとしています。 xとyのために:Pythonのリング内でランダムなx、y座標を生成しようとしています

x**2 + y**2 < 12.25 and x**2 + y**2 > 4 

私は次の関数を書いた:

def meteorites(): 
    circle = False 
    while circle == False:   
     r = np.array([uniform(-6., 6.), uniform(-6., 6.)]) 
     # we will regenerate random numbers untill the coordinates 
     # are within the ring x^2+y^2 < 3,5^2 and x^2+y^2 > 2^2 
     if (r[0]**2+r[1]**2 < 12.25) and (r[0]**2+r[1]**2 > 4.): 
      circle = True 

     else : 
      circle = False 

    return r[0], r[1] 

x = np.zeros(1000) 
y = np.zeros(1000) 
for i in range(1000): 
    x[i] = meteorites()[0] 
    y[i] = meteorites()[1] 
plt.scatter(x,y) 
plt.show() 

私は-3.5〜3.5平方を取得した座標をプロットするとき。私は問題を見つけるように見えない。私はそれがコーディングエラーかどうか、またはいくつかのおかしい数学の問題かどうかも分かりません。皆さんはお互いに良いことが多いので、私がここで間違っていることを見ていただけますか?

+3

次にX、Yのペアにそれを変換し、なぜランダム角度を生成しない、代わりに距離? –

+0

@MartijnPieters距離を一様に生成すると、内側のリングでポイントの密度が高くなります。 – kennytm

答えて

8

リング内のランダムな点の分布を得るには、薄い円形領域の相対的な領域を考慮する必要があります。 How it works for the circle enter image description here

あなたのケースでは、内側と外側の2乗の範囲でSquaredRの均一な分布を生成します。擬似コード:二回meteorites()を呼び出すinsstead、一度だけ呼び出します。

Fi = RandomUniform(0, 2 * Pi) 
SquaredR = RandomUniform(inner*inner, outer*outer) 
R = Sqrt(SquaredR) 
x,y = R * Cos(Fi), R * Sin(Fi) 
5

ランダムな角度と2つの制約の間のランダムな距離をとります。ラジアルからの変換を使用して、次のように

import numpy 
n = 1000 
phi = numpy.random.uniform(0, 2*numpy.pi, n) 
r = numpy.random.uniform(2, 3.5, n) 

その後のx、y座標を構築することができます。

from math import sin, cos, radians, pi, sqrt 

def meteorites(): 
    angle = uniform(0, 2 * pi) # in radians 
    distance = sqrt(uniform(4, 12.25)) 
    return distance * cos(angle), distance * sin(angle) 
+0

パーフェクト。ダンク・ジ・ウェル! – user90465

+0

ええ、私はタイミングを見たときに気づいた。あなたが私の周りに適切な分布を調べるのに忙しかったので私はあなたのコメントを見ませんでした;-) –

0

あなたがnumpyのを使用して1000個のサンプルを生成するには、次の試みることができる:あなたはuniform distribution in a circle生成する必要がありますデカルト座標:XおよびYはNを反復処理することなく、今アレイであるとして

x = r * numpy.cos(phi) 
y = r * numpy.sin(phi) 

これは、numpyののパワーを示しています。

x[i] = meteorites()[0] 
y[i] = meteorites()[1] 

これらはx[i]にリング上の一点からx値を割り当てます。この2行は、あなたがやりたいことはありませんので、

5

あなたがリングに該当しないランダムな点を取得しています、およびyの値から、~y[i]の異なる点に由来します。 meteorites()を2度呼び出すため、異なるポイントから座標を取得します。

x[i], y[i] = meteorites() 
1

は代わりに、あなたはおそらくサイン一度関数を呼び出し、その後、各座標に割り当て、または両方のターゲットは、等号の左側にある場所のiterableは、開梱して割り当てをしたいです@Martijn Pietersが示唆するように、あなたが必要とする範囲で極座標を一様に描画するだけです。

theta = uniform(0,2*np.pi) 
r = uniform(2.,3.5) 
x = r*np.cos(theta) 
y = r*np.sin(theta) 

EDIT:純粋に数学的に発生するように、リング内のすべてのポイントのために等しい確率があるでしょう。

しかし、現実的には、与えられたthetaのピクセルが少なくなり、rが下限に近づく。したがって、より小さな確率でより小さなrの「隕石」が発生します。

私はこの効果が無視できると信じています。

+0

円は2piラジアンを持っています。あなたは*半*リング上の場所をレイアウトしています。 –

+0

@ Martins Pieters corrected、thx。 –

2

また、リング範囲内でランダムな角度とランダムな距離を選択するループを実行します。それからコインを計算してください。

しかし、あなたのコード内で最初の問題は見ているがそれは書くべきである:

x[i],y[i] = meteorites() 

代わりに、あなたが二度Xを生じる)隕石を(と呼ばれている、あなたの例では

x[i] = meteorites()[0] 
y[i] = meteorites()[1] 

2つの異なる隕石。

2

あなたの実装はまた、あなたが1行を修正した場合に動作します。

x = np.zeros(1000) 
y = np.zeros(1000) 
for i in range(1000): 
    x[i], y[i] = meteorites() 
plt.scatter(x,y) 
plt.show() 

enter image description here

関連する問題