綾小路龍之介の素人思考

[省文字] 乱数の生成

例えば、ある関数f(x)がg(x)とh(x)の線形結合であらわされている場合、f(x)=a*g(x)+b*h(x)と書けるんだな。計算するたびにこのaとbを適当な数に変化させ、xとf(x)を出力する場合を考えるんだな。

C:\>perl -le "@S = map{rand} @S[0..9]; print \"@S\";"
0.6502685546875 0.025390625 0.410919189453125 0.35791015625 0.797760009765625 0.361724853515625 0.340911865234375 0.92474365234375 0.505035400390625 0.580718994140625
C:\>

上のようにすると大量に乱数を変数にセットできるんだな。こいつを使ってある関数g(x)、h(x)の線形結合を出力してみるんだな。

C:\>perl -le "sub f{@S=map{rand}@S[0..3]; return $S[3]*$_**3+$S[2]*$_**2+$S[1]*$_+$S[0];} for(1..10){$f=&f($_); print \"$_ $f\";}"
1 2.25576782226563
2 7.90341186523438
3 13.4155578613281
4 35.8011169433594
5 49.6056213378906
6 233.369232177734
7 120.380859375
8 267.388641357422
9 58.6871643066406
10 589.035797119141
C:\>

上の例が最大にスクリプトを長く書いた例で、これ以上は入力できないんだな。これを改良してより多くの独立な変数を使うことを考えるんだな。

C:\>perl -le "sub f{($a,$b,$c,$d)=map{rand}@S[0..9]; return $d*$_**3+$c*$_**2+$b*$_+$a;} for(1..10){$f=&f($_); print \"$_ $f\";}"
1 1.01864624023438
2 2.65805053710938
3 31.4973754882813
4 5.29510498046875
5 135.414398193359
6 117.433990478516
7 191.104675292969
8 240.653472900391
9 701.856262207031
10 420.729797363281
C:\>

最初の改良例はこんな感じなんだな。確かにf(x)の表記は単純になったけど、その分だけmap{}から受ける配列が複雑になってプラマイゼロの内容なんだな。どうにかしてもう一つ余分な変数上の例では$eもう一つ上の例では$S[4]をどうにかしたいんだな。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-11-22T07:45:44+09:00
  2. Modified: 2007-11-22T04:46:18+09:00
  3. Generated: 2017-08-24T23:09:21+09:00