投稿者 tel | 2014年7月28日

ランダムに座標を打つ

正方形の範囲に一様な点をうつにはxとy別々に乱数で求めればいい。

JavaScriptのMath.randomは1未満の値を返すので厳密にはちょっと違うけど気にしない。

// -1から1の範囲の乱数を返す
function rand() {
    return Math.random() * 2.0 - 1.0;
}
// 20x20のサイズの正方形の中に点を打つ
var x = rand() * 10,
    y = rand() * 10;

円周上に点を打つ。0~2πまでの範囲の角度をランダムに求めればいい。もしくはxとyを別々に求めて正規化しても円上の値になる。(ただし0,0のときはダメ)

var a = Math.random() * Math.PI * 2,
    x = Math.cos(a),
    y = Math.sin(a);

円の内側に点を打つ場合はどうするか。

円の範囲外だったら打たないことにするのが一番簡単。だけどこの方法だと指定の回数だけ点を打ちたい場合に困る。

var x = rand(),
    y = rand();
if(x * x + y * y < 1) {
    // 円の不等式を満たすなら点を打つ
}

極座標で点を打つ。一様にならなくて真ん中に偏る。

r = Math.random() * Math.PI * 2.0;
s = 150 * Math.random();
x = s * Math.cos(r) + 200;
y = s * Math.sin(r) + 200;

rand_2

円の方程式を解いて乱数をかける。これも一様にならなくて左右に偏る。

x = rand();
y = Math.sqrt(1 - x * x) * rand();
x = x * 150 + 200;
y = y * 150 + 200;

rand_1

一様にする方法を検索したら見つかった。
http://apollon.issp.u-tokyo.ac.jp/~watanabe/pdf/prob.pdf

極座標で半径に直接乱数をかけるんじゃなくて平方根をとってからかければいいらしい。

r = Math.random() * Math.PI * 2.0;
s = 150 * Math.sqrt(Math.random());
x = s * Math.cos(r) + 200;
y = s * Math.sin(r) + 200;

rand_3


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

カテゴリー

%d人のブロガーが「いいね」をつけました。