アクセシビリティ
[an error occurred while processing this directive]

Title

Math.random() でランダムな整数を取得する方法関連製品


Flash 4では、関数「random()」でランダムな整数を取得できましたが、Flash 5 以降ではこの関数は使用禁止となっており、「Math.random」メソッドの使用が推奨されています。(『AcrionScript リファレンスガイド』 p.324~)
「Math.random」は、0 以上 1 未満の浮動小数で結果を返します。したがって、乱数を整数で得るには、工夫が必要です。

※「Math.random」は、0 以上 1 未満の浮動小数で結果を返します(『ActionScript リファレンスガイド』の「Math.random」の項には「0.0~1.0」とありますが、1.0「以下」ではなく ECMA 仕様にもとづき1.0「未満」です)。

 

1

結果を整数で得る
結果を整数に変換するには、2 つのメソッドが考えられます。
ひとつは、「Math.round」です。引数の数値を小数点以下四捨五入して返します。
例えば、サイコロの目と同じ 1 ~ 6 の乱数を得る方法を考えてみましょう。使用しているメソッドについて、詳しくは『AcrionScript リファレンスガイド』をご参照ください。

Math.round (Math.random () * 5) + 1


これで 1 から 6 までのランダムな数値が得られます。ただ、この方法には問題があります。最大値と最小値、つまり 1 と 6 の出る確率が他の整数の出る確率の半分になってしまうからです。

四捨五入する前の値 (Math.random () * 5) は、0 から 5 になります。そして、四捨五入して 0 になるのは、0 から 0.5 未満の値まです。また、5 になるのは 4.5 から 5 までの数値です。どちらも対象となる数値の幅は 0.5 です。
これに対して、他の整数はプラスマイナス 0.5 の小数値が対象となり、その値の幅は 1 になります。したがって、最大値と最小値の出る数値の幅は、他の整数の半分となってしまうのです。

これを避けるには、つぎのような式にすることが考えられます。

Math.round (Math.random () * 6 + 0.5)


また、別のメソッドを使っても同じ結果が得られます。
それは「Math.floor」メソッドを使う方法です。このメソッドは引数の数値の小数点以下を切捨てた整数を返します。

Math.floor (Math.random () * 6) + 1

2

指定した範囲のランダムな整数を得る
それでは、11から20までのランダムな整数を得るにはどうしたらよいでしょう。
1で考えた式が応用できます。つまり、定数 10 に 1 から 10 までのランダムな整数を加えるのです。

Math.floor(Math.random()*10)+11


最大値と最小値を変数に設定した場合を考えると、つぎのようなステートメントになります。

nMax = 20;
nMin = 11;
nRandomInt = Math.floor(Math.random()*(nMax-nMin+1))+nMin;

3

ActionScriptを作成する
整数の範囲を任意に指定して、ランダムな整数を取得するActionScriptを作成してみましょう。これを「function」として定義しておけば、ムービー内の異なるスクリプトから関数として呼び出すことができます(使用されているアクションやメソッドについて、詳しくは『ActionScriptリファレンスガイド』をご参照ください。また「function」の使用例については、別途文書 FAQ ID: FL016118「"function" を使用した1例」をご覧ください)。

function xRandomInt (nMax, nMin) {
// nMinからnMaxまでのランダムな整数を返す
var nRandomInt = Math.floor(Math.random()*(nMax-nMin+1))+nMin;
return nRandomInt;
}


これがもっともシンプルなステートメントで構成された関数です。最大値nMaxおよび最小値nMinをパラメータとして渡すと、その範囲内のランダムな整数を返します。

この ActionScript に、もう少し汎用性をもたせてみます。まず、パラメータはひとつでも動作した方が便利です。その場合は、1 から指定した整数までのランダムな整数を返すこととします。
つぎに、2つのパラメータの大小の順序は問わないことにします。大きい方の整数を最大値、小さい方の整数を最小値として扱うように、ステートメントを加えます。

パラメータに値が設定されているかどうかは、「typeof」演算子で評価できます。値が未設定なら、"undefined"が返されます。また、数値が設定されていれば、 "number"が返ります。これを「if」アクションで判定し、値が設定されていなければ 1 を代入します。

2 つのパラメータを比較して最大値、最小値を設定するには、「if」アクションを使うことも可能です。ただ、Math オブジェクトには、最大値や最小値を得る「Math.max」「Math.min」メソッドがありますので、これを使えば簡単でしょう。

ステートメントを加えた関数 xRandomInt は、つぎのようになります。パラメータとして2つの整数を指定すれば、その範囲のランダムな整数を返します。また、ひとつのパラメータのみ指定すれば、1 から指定した整数までのランダムな整数が得られます。

function xRandomInt (nInt1, nInt2) {
// 第2パラメータnInt2が指定されていない場合の処理
// nInt2が数値でなければ1を代入
if (typeof (nInt2) != "number") {
nInt2 = 1;
}
// 大きい方の値をnMaxに小さい方の値をnMinに設定
var nMax = Math.max(nInt1, nInt2);
var nMin = Math.min(nInt1, nInt2);
// nMinからnMaxまでのランダムな整数を返す
var nRandomInt = Math.floor(Math.random()*(nMax-nMin+1))+nMin;
return nRandomInt;
}

 

 


 


文書番号
(228622)

最終更新日
2011-02-23

アドビサポートのご案内

さらにヘルプが必要ですか?
各種サポートオプションの利用方法をご覧ください。
アドビへのお問い合わせ