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

こんなかんじ。