| Math Object | |
|
Mathオブジェクトは数値に関する操作をする為の固定オブジェクトです。
数値と言っても数値に関しては numberオブジェクトなので、
このMathオブジェクトは数値を数学的な公式処理をするような物だと思ってください。
他のオブジェクトのように Mathオブジェクトを生成する と言う事はありません。
Math.メソッドという形で使い、常に Math が付くと思ってしまっていいです。
プロパティと一部のメソッドは数学的に少しわかりずらい事が多いので、
省かせてもらいます(^^;)
一般のスクリプト上で良く使用するメソッドを解説して行きます。
メソッド |
|
訂正: 1以下 → 1未満
どうも勘違いしていたようですm(__)m
Math.random() | [Moz2レベル] 乱数 |
Math.random() はこの記述が実行された時点で、
乱数を発生させます。乱数とは 0以上1未満の 任意の数値です
偶然の数(ランダムな数字)が欲しい時にこれを使います。
次のボタンを押すと、毎回 Math.random()を実行して乱数を取れます。
基本的には
var Rnum = Math.random()
この様に書き、変数 Rnum に数値型として発生した数値が格納します。
注意事項として、IEでは 数値として 0.xxxxxのようになりますが
Netscapeでは 0がなく .xxxxのようにピリオドから始まります。
文字列化して扱う場合に注意してください。
現在のNetscape、Firefox等は普通に 0.xxxx となります。
|
Math.ceil() | [Moz2レベル] 切り上げ |
Math.ceil(n)は n の小数点以下の値を切り上げた値を返します。
var Cnum = Math.ceil(3.141592653589793)
Cnum には 4 が入ります。
調べた結果では、最小値に限りなく近い場合は、
17番目以降の数値によっては切り捨てになってしまうケースも発生します。
それ以上なら、切り上げになります。
Math.ceil(3.0000000000000002)は 3になります。
Math.ceil(3.0000000000000003)は 4になります。
乱数などから値を得る場合、この稀に起きる可能性(ほとんどあり得ない)も排除するのであれば、
例えば1〜10の数字を取るなら、parseInt(Math.random()*10, 10)+1 の様にparseIntで整数値だけを取り出して1を足した方がさらに安全ですね。
|
Math.floor() | [Moz2レベル] 切り捨て |
Math.floor(n)は、n の小数点以下の値を切り捨てた値を返します。
var Fnum = Math.floor(4.23651)
Fnum には 4 が入ります。
調べた結果では、最大値に限りなく近い場合17番目以降の数値が8以上だと、
切り上げになってしまうケースもあります。
それ以下ならきちんと切り捨てになります。
Math.floor(3.9999999999999997)は3になります。
Math.floor(3.9999999999999998)は4になります。
乱数などから値を得る場合、この稀に起きる可能性(ほとんどあり得ない)も完全に排除するのであれば、
Math.floor()、Number()、parseInt()などを使わずに、文字列として小数点を見つけて切り分ける必要があります。
|
Math.round() | [Moz2レベル] 四捨五入 |
Math.round(n)は、n の小数以下の値を四捨五入した物を返します。
var Rnum = Math.round(4.45689)
Rnum には 4 が入ります。
四捨五入なので 小数点以下 第一位が 4か5かで決まります。
調べた結果では、実際は第一位が4でも次のようになります。
Math.round(3.4999999999999997) 以下は3になります。
Math.round(3.4999999999999998) 以上は4になります。
ここが境目と言う事ですね。
|
Math.pow() | [Moz2レベル] 累乗 |
Math.pow(x,n) は、基数 x を n乗した数 (xn)を返します。
var Pnum = Math.pow(10,5)
Pnumには 10の5乗 10000 が入ります。
|
Math.sqrt() | [Moz2レベル] 平方根 |
Math.sqrt(n)は、n の平方根を求めて返します。
var Snum = Math.sqrt(3)
Snum には1.7320508075688772 が入ります。
n に マイナスの数を入れると NaN(Not a Number)が返ります。
|
Math.abs() | 絶対値 |
Math.abs(n)は、n の絶対値を返します。
var Anum = Math.abs(-9)
Anum には 9 が入ります。
|
Math.min() | [Moz2レベル] 比較して小さい方を取る |
Math.min(a,b)は a、bを比較して小さい方を戻り値とします。
var a=8,b=9
var Mnum = Math.min(a,b)
Mnum には 8 が入ります。
|
Math.max() | [Moz2レベル] 比較して大きい方を取る |
Math.max(a,b)は、a、bを比較して大きい方を返します。
var a=8,b=9
var Mnum = Math.max(a,b)
Mnum には 9 が入ります。
|
Number.toString() | [Moz2レベル] 生成された数値オブジェクトを文字列に |
Mathオブジェクトのメソッドではないのですが、Mathに対してプロパティ、メソッドで
返された値は Numberオブジェクト(数値型変数)になっています。
それを数値としてではなく文字列として扱う時に toString()を使います。
Math.random().toString()
乱数を発生させそれを文字列にしています。
|
Tips & Samples |
|
◆Math.random() で取った乱数の利用の仕方
n = Math.random() とすると、n には 乱数が入ります。
この n の値は 0以上 1未満の値ですので利用しやすい桁に直します。
n = Math.random()*10
ここでは 10を掛けています。n は 0以上 10未満の数になります。
このままでも n > 5 の様な比較式で条件文に使えます。
もっと利用しやすい形にするには、整数値にします。
【 切り捨てを使って整数値にする 】
n = Math.floor(Math.random()*10);
こうすると n には 0 〜 9 の整数値が入ります。
(Math.floorのせいで稀に繰り上がって10が出る可能性あり)
【 切り上げを使って整数値にする 】
n = Math.ceil(Math.random()*10);
こうすると n には 1 〜 10 の整数値が入ります。
(稀に0が入るので正確には0〜10の数値の可能性)
どちらにしても 10個の整数値がランダムで取れる事になります。
これが世間一般で良く使われている方法です。
が、注意があります。
理論上 Math.random()は 0 〜 1未満 になります。
つまり、0.0000000000000、0.9999999999999・・・となる事があり得ると言う事です。
既に書いてありますが、乱数発生の丁度最大桁数あたりの末尾の数値次第では、
稀に切り上げなのに切り捨て、切捨てなのに切り上げと言う現象が起きる可能性を含んでしまいます。
これは n > 5 と言う使い方をしても同じです。
例えばalert(3.0000000000000002 >3)
これは人間の頭ではtrueになりますが、
実際にやってみるとfalseになります。
Math.ceil()は 整数値部分が2以下だと正しく動くようなので問題はありませんが、Math.floor()は問題ありです。
そこでparseInt()を使うと、思っていたのですが・・・
parseInt(3.9999999999999998)も4になってしまいますし、
Number(3.9999999999999998)も4になってしまいます。
parseInt("3.9999999999999998")は 3になりますが、
n= 3.9999999999999998;
n = n.toString();
parseInt(n)は 4になります。
0〜9までの数値を取る時に3.9999999999999998が4になっても特に困りません。
が 9.9999999999999998 が 10になってしまうと 0〜9の数値以外の可能性の対処を考えていないプログラムを書いてると
ごくごく稀にエラーが出てしまいます。
100%確信したい場合は、単純には
*1
n = Math.floor(Math.random()*10); //理論上0〜9、稀に10
if(n>9) n = 9; //万一10が出た場合は9にする
とか、1塊にするなら
*2
n = Math.min(Math.floor(Math.random()*10, 9);
// 9 の部分は取り出す最大の整数値の限度
の様になります。
ここまでやる必要があるのか?については、そのプログラムの重要性次第です。
確率は物凄く低いですから。
起きないと言っても良いレベルなので大抵はスルーでOKですね(笑)
ランダムに 10個の数値を取れるわけですから、これを利用する事で
動的な事ができるようになりますね。
単純には
if(n == 5)の様に nの値を if文で条件分岐させる。
この他にも、この 乱数を配列の Indexとして使う、
直接ファイル名として使う
"./images/img" + n + ".gif"等です。
私の使っているのでは、Programにある Hight&Low で使っている
トランプの札は、Math.random()で取っています。
10個の任意の数でなく、もっと端数の場合は?
100個なら Math.random()*12とかでよいです。