裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

3 次元空間の単位ベクトルを表す乱数(その3)

2014年08月06日 | ブログラミング

新しい記事「3 次元空間の単位ベクトルを表す乱数(その4)」を参照

n 次元空間に拡張するには,(その2)の PearsonProblem3 が都合がよい。というか,2 箇所にある 3 を引数(dimension としよう)で指定してやるだけだ。

PearsonProblem4 = function(n = 4, dimension = 5, dR = 0.1, trial = 1e+05) {
    xyz = array(runif(dimension * n * trial, min = -1, max = 1), dim = c(dimension, n, trial))
    xyz = apply(xyz, 2:3, function(xyz2) xyz2/sqrt(sum(xyz2^2)))
    apply(xyz, 3, function(xyz2) sqrt(sum(rowSums(xyz2)^2)))
}
ans = PearsonProblem4(n = 2, dimension = 2, trial = 1e+06)
mean(ans)
hist(ans, nclass = 50)

で,上のように,2 次元で 2 歩進む場合をやってみると,原点と到達点の距離が 2 に近いというのが意外と多い。

プログラムを間違えたかと,図に描いてみた。

PearsonProblem5 = function(n = 4, dR = 0.1, trial = 1e+05) {
    dimension = 2
    theta = seq(0, 2 * pi, length = 500)
    x = n * cos(theta)
    y = n * sin(theta)
    plot(x, y, type = "l", asp = 1)
    xyz = array(runif(dimension * n * trial, min = -1, max = 1), dim = c(dimension, n, trial))
    xyz = apply(xyz, 2:3, function(xyz2) xyz2/sqrt(sum(xyz2^2)))
    apply(xyz, 3, function(xyz2) {
        lines(c(0, cumsum(xyz2[1, ])), c(0, cumsum(xyz2[2, ])), col="gray80")
        points(cumsum(xyz2[1, ])[n], cumsum(xyz2[2, ])[n], col = "red", pch = 16)
    })

}
PearsonProblem5(n = 2, trial = 100)

確かに,半径2の円周の近くに達する場合が結構ある。



パラドックスかなあ。

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 3 次元空間の単位ベクトルを... | トップ | 「折れ線グラフに原点不要」... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事