確率の難しめな話で発狂 

…やりたいことを明確にするために人に説明できるか試してみよう。
初等か高等か解らないけど数学、確率、『乱数』の話です。
きれいに偏った乱数を作るにはどうするか?
長くなりすぎたので格納。というか封印。頭の痛かった話です。

ドット絵、何か数学で発狂しかかった頭で描いたからこれも格納しようと思ったけど、晒す。
もう折角だから拡大してやる…。グロ注意。遅いか。
BigEye(Peeper)_01.pngBigEye(Seeker)_01.pngBigEye(Gayzer)_01.pngBigEye(Watcher)_01.pngBigEye(Beholder)_01.png
Sa・Ga2より目玉祭り。
一部勝手にネーミング。
左からピーパー、シーカー、ゲイザー、ウォッチャー、ビホールダーです。
どれも「見る」という意味の英単語からとってきてます。
まひにらみ、せきかにらみ、はかいこうせんまで打って、最後に自爆する素敵なやつらです。
触手は絡まった思考回路のごとく増えてます。
こんな気色悪いの何処で出すのかと言うと、紫のスキマの中。
そこでなら敵として出てきても問題あるまい。
こういうグロテスクなのは割と好み…w
ああ、数学を理解できる能力が欲しいorz
藍さまとか紫とかなら解きそうだなwと。(橙にも負けそうな自分がいる)

解らなかったら私の説明が未熟だ。いざ。
プログラミング、特にゲームには『乱数』と言うものが存在します。
STGならランダムな散弾の角度、RPGならダメージのぶれ幅…などに使われます。
これは通常の状態では、ある範囲内の値を一様な確率でピックアップします。
例えば、サイコロ。1~6のどれかの目が均等な確率で出ます。
サイコロの面の数が変わっても同じで、1~目の数までのどれかの値が1つ得られます。
このサイコロで実用レベルの乱数が得られます。
散弾の例えで言うと、ばらばらに飛ぶ弾を作るときにどの角度にどの速さで打つか?
例えば-45度~+45度に速度5~20で50発打てば扇状の散弾が出来ます。
広がり方を変えたければ角度や速度、つまりサイコロの目の値を変えればいい。
とここまではそれほど難しくない話。要するにサイコロを振って出た目を使うだけ。
…ここから本題。
『乱数』を偏らせたい時はどうするのか?
例えば、6の目が出やすいイカサマサイコロを作りたいときはどうするのか?
そのときは出る目の確率を変えてやれば良い。
例えば、6が出るのは1/6、つまり6回に1回の確率だから、
それを例えば1/2、つまり2回に1回にしてしまえば6が出やすくなる。
なるほど、確率の値を変えれば偏らせることが出来る。と言うのはとても簡単。
じゃあ例えば、1~100の目のサイコロの大きい値を出やすくするには?
これを調べていました。ここから難易度アップ。
普通の6面サイコロの確率を表すと、全ての目で1/6、その合計は1。
つまり関数で表すと
 F(x)=1/6(1≦x≦6)
 F(x)=0  (x<1、x>6)
 (離散的とかの話はしません。実用上は問題ないしややこしすぎるので。)
この関数Fを確率密度関数と言います。(ここから良くわかってなくて曖昧orz)
この確率密度関数Fを好きな形にすると、好きなように目が偏ります。
そしてその積分値は1に必ずなります。(全確率の合計が1にならないとおかしいです)
さあ、お前の好きなようにFを作れ。
…と言われた。うむ。Fは作れる。
ちょっと偏らせたいだけなら難しくは無い。1次関数でいい。
でも困った。どう実装すればいいのだろう?
累積分布関数というのを作るといいらしいのだが、頭が沸騰しそうだったorz
確率密度関数から累積分布関数への変換が良くわからなかった。
微積分の基本辺りが怪しい人間にそんなものが理解できるのか?
でもこれが出来ると面白いことが出来る。
例えば、妙に真ん中が分厚い弾幕とか、ラッキーヒットばかり出す武器とか。
無論、理論無視してごまかしも効くんだけど、そういう方法は応用が出来ない。
おお、長くなった上にしまらないorz
数学、勉強してきます λ...
web拍手 by FC2

[2008/06/26 23:06] ドット絵 | TB(0) | コメント(2)

難しいことを考えてるんですね

確率分布ってもしかしたら、確率的な分布を表現する数式なのでは??サイコロをふって出てくる目を数式で表すならこんな感じの数式で、ということかなと…。

自由な分布ということなら、むしろ適当な関数を使う方が楽といえば楽なような気がします。たとえば、あとから増やすなら指数関数とか。 うーん…



[2008/06/27 23:40] [ 編集 ]

大体その理解で正しいと思います。
確率分布とは、確率変数の各々の値に対して、その起こりやすさを記述するものとのこと。
要するに、サイコロ振って出る目を横軸、出る確率を縦軸にとったグラフです。
これを関数の形で書けば、確率密度関数となります。
で、この関数を累積した形で書くと(すなわち積分形)、が累積分布関数らしいです、
例えば、サイコロ2個を振って5以下が出る確率は
2~5の確率全てを合計して(下限~目標値まで積分して)解は10/36になります。

適当な関数を使うで正しいのですが、
それをどうやってプログラム上で再現するかで頭を抱えているのですorz

>たとえば、あとから増やすなら指数関数とか
そのとおり。後から増やすなら指数関数で正解ですw
しかしあれだとちょっと増えすぎてしまいますね。悩みどころ。

折角だから理論は置いておいて、もっと実用的にどんなことが出来るか?
を記事にしてみようと思います。

[2008/06/28 16:02] AI [ 編集 ]

コメントの投稿

Please, write a comment in Japanese(or use web translator).














管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://gridnote.blog62.fc2.com/tb.php/102-192cc6ef