random × floor?/round?/ceil?
CATEGORY : Memo
2006年06月02日 20:27
私が授業中につっこんで、あいまいだったような気がする、
切捨てとか、四捨五入とか、切り上げとかの話。
ほぼ、自分メモだけど、何のことだか分かってない人が多いんじゃないかと思ったので
トラックバックして記事にしておく。
以下、全体が4フレームあるムービークリップについて
今日やったことと同じことをしたい場合。
■Math.random();について
0以上1未満までの数字(0.00000… 〜 0.99999…)を無作為にとる。
■Math.random() * _totalframes;について
これに、全体のフレーム数1_totalflames(=4)をかけると
0以上4未満までの数字(0.00000… 〜 3.99999…)を無作為にとることになる。
ここで欲しい数字は、1、2、3、4の4つの整数の数字なので
切捨て、四捨五入、切り上げのいずれかをつかって、
小数点の数字を整数にする必要がある。
それぞれ、実行すると下図のようになる。
解説図
この場合、一見すると、ちゃんと4まで出てくる
四捨五入、切り上げのどちらかが正解に見えるが、
じつは0が含まれているので、不適切。
正解は、切捨て。
切捨てを使うと、0、1、2、3の数字が出てくることになるので
切捨てした後の変数に1を足してあげれば、
1、2、3、4が出てくる。
ActionScriptを示すと、
a = Math.random() * _totalflames;
a = Math.floor(a) + 1;
または、まとめて、
a = Math.floor ( Math.random() * _totalflames ) + 1;
ということになる。
と、いうこと。
以下蛇足
では、もし、0〜4が欲しいときは四捨五入、切り上げでいいのか?
というと、実は、そうではない。
図を見て欲しいのだが、色のバーの長さは、
そのまま、その数字がどのぐらいの割合で出てくるか(=出現頻度)
になっている。
四捨五入の場合、0、4がやや少なく、
切り上げの場合、0が極端に少ない。
これだと、数字が均等に出てこなくなってしまうので、
実は、ランダムの値を整数にするときに
この二つは使ってはいけない。
(値を偏らせたければ問題ないが)
この場合も、やっぱり切捨てを使う。
0〜4であれば、
Math.random()に4+1の5を掛けて、その値を切り捨てることになる。
a = Math.random() * (4+1);
→0.0〜4.9
a = Math.floor(a);
→0、1、2、3、4
こんなかんじ。

NORI
2006年06月05日 15:26
解説をありがとう。
私のスクリプトで間違っているところを指摘してもらえるのは、助かります。
なにせ、間違いだらけだろうから。