乱数の利用
1. 乱数の基本
 このページでは,javascriptのビルドイン・メソッド(ブラウザにあらかじめ組み込まれている関数のようなもの)を使って,乱数を発生させることを学びます.
 javascriptの乱数は,
【要点】
Math.random();
の形で書くと,0以上1未満の小数が返される.(Mは大文字,rは小文字でなければならない)
(1) 例えば,xx1 = Math.random();とすると,0≦xx1<1となる小数が1つ得られる.理屈上「0は出る可能性があるが,1が出ることはない」.
(2) 「さいころの目」を出す実験で,「1から6までの整数を1つ発生させる」という場合,次の3段階で作るとよい.
i) まず,
xx1 = Math.random() * 6;
により0≦xx1<6の範囲の小数が得られる(0は出るが,6は出ない)
ii) 次に,Math.floor(引数)というビルドイン・メソッドを使って,小数部分を切り捨てて整数部分だけを取り出す.
mm1 = Math.floor(xx1);
とすると,mm1は0から5までの整数になります.
iii) 最後に,
nn1 = mm1 + 1;
とすると,nn1は1から6までの整数になります.
※1行にまとめて,
nn1 = Math.floor(Math.random() * 6)+1;
もしくは
nn1 = Math.floor(Math.random() * 6 + 1);
と書くこともできます.
 このように短縮形にする方を,C言語らしいプログラムになるなどと重宝する人もいますが,この教材の管理人の考え方は逆で,上のi)〜iii)のようにスモールステップで書いていく方を好みます.その理由は,ステップを細かく分けておくと,エラーが起きたときに,エラー箇所を見つけやすいからです.(右欄:変数ウォッチの仕方参照)
2. 変数ウォッチの仕方
 プログラミングをやっていると,プログラミング言語上の文法的なミスをやってしまうことや,文法的には正しくても意図したものと違う結果になるミスなども起こります.
 各々のプログラミング言語の開発環境には「デバッガ」(バグ=虫=プログラムの不具合.この単語に接頭語deを付けて,バグを取り除くツール)が利用できることが多いですが,デバッガを使いこなすには相当な実力が必要で,簡単ではありません.さらに,文法的にはエラーがない場合,デバッガは何も教えてくれません.
 そこで,この教材の管理人がお勧めする方法は「変数のウォッチ」です.それぞれの段階で変数の値がどうなっているのかチェックすると,エラー箇所が見つかるのです.
 具体的には,ページの空いている場所に
などと書いておくと,そのときの変数xx1, mm1, nn1の値が表示されますので,作者の意図と異なるものがあれば見つかるのです.
 点検,訂正が済んだら,以上の記述をコメントアウト(または削除)して,青書にするとよい.
3. コンピュータで作られるのは疑似乱数
 コンピュータで作られる乱数は疑似乱数と呼ばれ,種(seed)となる数字を利用して作られる系列をなしています.
 C言語などのプログラミング言語では,このseedを初期化して使う方法がとられますが,javascriptではこうした初期化関数はなく,Math.random()メソッドを使用したときのtime()をseedに使って自動的に初期化する方法が採用されていると言われています.…time()は1970年1月1日からの時間をミリ秒で表したもの.
 だから,javascriptで生成した乱数は,完全な乱数ではなくて,種(seed)がばれてしまったら芋づる式にばれてしまう可能性があり,疑似乱数を使って重要なパスワードを作るのは危ないと言われています.
昔,MS社のあるプログラミング言語を使って,初回配布用のパスワード(2回目からはユーザが書き換える)を大量に作っていたとき,先頭の1文字にアルファベット大文字のFが出やすいことがあった.これは,0〜9,a〜z,A〜Zのように並べたとき先頭から41番目がFになっていて,乱数の初期化が甘いと41から始まる系列ばかりになるためであった.
 このような事情も頭の片隅に置いておくとして,ここでは疑似乱数の基本的な使い方を練習します.

4. 乱数を利用したプログラムの例
【例1】
 乱数を使った模擬的な実験を行い,さいころを合計600回振ったときに,1〜6の目がそれぞれ何回ずつ出るか調べてください.
(答案例)
ほとんどの場合,80回〜120回の間に入るようです.
6000回振ったときは,800回から1200回の間にはならず,ほとんどの場合950回から1050回の間になります.
60000回では,9500回から10500回の間でなく,もっと狭くなります.あまり大きな回数(1億回など)をテストするとパソコンが止まってしまうので,多くとも万のオーダーまでにする方がよいでしょう.
【例2】 ≪モンテカルロ法≫
 右図のような半径1の円の面積はとなることは知られていますが,その正確な証明は微積分を使って行われます.
 ところが,微積分を全く使わずに乱数を使って円の面積を求める方法があって,ギャンブルで有名なモナコの地名モンテカルロに因んで命名されたモンテカルロ法と呼ばれます.
 もし乱数2つの組 (x, y) がうまくバラついていたら,でたらめに作った点 (x, y)が円の中に入る確率は,円の面積と正方形の面積の比に等しいはずです.
 例えば,100000組の乱数の組 0≦x, y<1についてならその点は,円の内部にあると判断できます.このようにして,円の内部に入る確率を求めて,円周率が辺りになることを示してください.
(答案例)
※モンテカルロ法は,微積分を使わずに円の面積が求められるという点では驚くべきものですが,やって見れば分かるように,値の精度はあまりよくありません.

【例3】 ≪パスワードの作成≫
 乱数を用いて@数字(0〜9),A英小文字(a〜z),B英大文字(A〜Z)の中から文字数8文字以上13文字以下のパスワードを作りたいと思います.ただし,文字数も乱数で選び,@ABの中から予定の文字数が選ばれていればよく,例えば@やAの分類が1つも含まれていないものでもよく,同じ文字が何回表れてもよい場合.
(答案例)
文字数も秘密にします
【例4】 ≪連立方程式の問題作り≫
 連立方程式


は,のとき,ただ1つの解

を持ちます.
 さて,余り複雑な係数にならないように,の範囲で上記の条件を満たす問題を作りたいと思います.このような問題を,乱数を使って作ってください.
(答案例)