0

100X100 の配列を考えてみましょう。

  1. (3,75) と (56, 34) など、そのような配列内に数千のランダムな位置の配列を生成します。
  2. ランダムな位置の 1 つが任意の (直線) エッジの 15 ピクセル以内に収まる頻度を計算します

プログラミング言語 Python の学習を支援するために、上記の質問をしようとしています。プログラミングは初めてです。

これが私がこれまでに持っているものです:

from __future__ import division
from pylab import *
import math as m
from numpy import *

array1=[]
nMax=1001
n=1
while n<nMax:
    array1.append(random.randint(1, 101))
    n=n+1
array1=array(array1)
array1=array1.reshape(1000,1)
print array1

array2=[]
nMax=1001
n=1
while n<nMax:
    array2.append(random.randint(1, 101))
    n=n+1
array2=array(array2)
array2=array2.reshape(1000,1)
print array2

これにより、1000 個のランダムな整数の単一列配列が 2 つ生成されます。1 つの配列は x 座標のランダムなセットで、もう 1 つの配列は y 座標のランダムなセットです。2 つの配列をマージして、x 座標と y 座標の配列を 1 つにしようとしていますが、どうすればよいですか? ランダムな x 座標と y 座標の単一の配列を取得したら、if、else ステートメントを使用して質問を完了することができますか? たとえば、xcoordinate>85 または xcoordinate<15 または ycoordinate>85 または ycoordinate<15 の場合、空のリストに数値を追加し、リストの長さをカウンターとして使用しますか?

誰かがこの質問についてのガイダンスを教えてください。私はそれを正しい方法でやっていますか?もしそうなら、私はどうですか?もしそうなら、どうすれば続けられますか?

. . . みんなの助けに感謝します。

これらの 2 つの部分を完了することができましたが、前の部分の延長としてこれを行うことに挑戦しました。

iii) ランダムな位置の 1 つが、半径 50 ピクセルの円の 15 ピクセル内 (両側) に収まる頻度を計算し、結果を画面に書き込みます。たとえば、配列内の位置の平均 N% がこの領域にあります。 [N は 0 から 100 までの数値] 角の座標は円から 15 ピクセル以内にあることに注意してください (15 ピクセル以上離れている場合は、そうすべきではありません)。

iv) ユーザーから配列内の場所を要求し、その場所がその領域に該当する場合に警告するコードを追加します。

これについてどうすればいいですか?どこから始めればよいかさえわかりません。誰か私にいくつかの指針を教えてもらえますか?ありがとう

4

1 に答える 1

1

配列の実際の生成をスキップして、周波数計算に直接進むことができます。

まず、x 座標と y 座標の両方が完全にランダムであるため、次の点に注意してください。

ルールがあります:

P(A or B) = P(A) + P(B) - P(A and B)

だから私たちはそれを言うことができます

P(X or Y within 15) = P(X within 15) + P(Y within 15) - P(X and Y within 15)

X と Y は から0 to 99(または から1 to 100) 一様にランダムであることが暗示されているため、次のように仮定できます。

P(X within 15) = P(Y within 15)

だから全体がなる

P(X or Y within 15) = 2P(X within 15) - P(X within 15)^2

あとは、計算するだけですP(X within 15)。X は整数値しかとれないため、関数f(x) = |X - 49.5| - 35は と に対してゼロより大きくなりx = 0..14ますx = 85..99。(ゼロからインデックスを作成していますが、から移動するのと同じです1...100)。

したがって、コード:

from random import randrange

N = 3000
P_x_within_15 = sum(abs(randrange(100) - 49.5) - 35 > 0 for _ in range(N)) / float(N)

print "Frequency of X or Y within 15 pixels of edge:",
print 2 * P_x_within_15 - P_x_within_15 ** 2

お気づきかもしれませんが、実際に配列を作成することはスキップし、生成された乱数のブール値 (True = 1、False = 0 の True/False) の結果を加算しただけです。

編集 - 実際に配列を作成する

100 x 100 マトリックスのランダム座標の配列を作成するには:

numpyコードを使用すると、次のようになります。

from random import randrange
N = 3000
coords_array = array([randrange(100) for _ in range(2 * N)]).reshape(N, 2)

純粋な python を使用すると、次のようになります。

from random import randrange
N = 3000
coords_list = [(randrange(100), randrange(100)) for _ in range(N)]

ここで注意すべき点がいくつかあります。

  1. Python では、インデックスはゼロから順に並べられます。randrange(100)0 から 99 までの数値が返されます。

  2. N生成したい座標の数です

  3. 用語のポイント: Python では、角括弧で表されるデータ構造はlists であり、配列ではありません (他のプログラミング言語では配列と同等ですが)。上記のコードでは、(別のデータ構造である)ではなくarray1pythonです。対比:ただし、配列を広く使用します。コードで を実行すると、実際には配列が作成されます。listarraynumpyarray(array1)numpy

  4. 角括弧の間のものはリスト内包表記と呼ばれます。意味的には次のものと同等です。


coords_list = []
for _ in range(N):
    coords_list.append((randrange(100), randrange(100)))

于 2013-04-09T13:26:55.667 に答える