Math.randomの代わりにメルセンヌツイスターで偏りのないランダムな数字を取得する
2015年9月24日 javascripts
【PR】当サイトにはアフィリエイト広告が含まれています。
WEBダイスでランダムな出目を作るために、javascriptsのMath.random関数を使っていたのですが、
「JavascriptのMath.randomは偏りが酷いので、メルセンヌツイスター等を使ったライブラリを利用したほうが良いかと思います。」
とのアドバイスをいただきましたので、メルセンヌツイスターを実装してみました!
メルセンヌツイスター
http://homepage2.nifty.com/magicant/sjavascript/mt.html
Math.randomの代わりにメルセンヌツイスターで偏りのないランダムな数字を取得する
メルセンヌツイスターのサイトの「使い方」を見ると、
1 2 3 |
var mt = new MersenneTwister(); var integer1 = mt.nextInt(0, 5); // 0 以上 5 未満の整数 var decimal1 = mt.next(); // 0 以上 1 未満の実数 |
このように書いてありました!
Math.random関数の部分を上記のように書き換えれば良いのですが、私はこれを見たときに実際にどう使えば良いか分からなかったので、実際にMath.random関数をメルセンヌツイスターで書き換えてみます!
Math.randomで作った6面ダイスのソース
まず、Math.random関数で作った6面ダイスのソースを見てみましょう!
HTMLソース
1 2 |
<input type="button" value="ダイスロール" onclick="getDice();"> <span id="condice"></span> |
この<input type="button" value="ダイスロール" onclick="getDice();">
をクリックすると、
<span id="condice"></span>
の中に1~6の数字がランダムで表示されるようにします。
Javascriptsソース
1 2 3 4 |
function getDice() { var dice = Math.floor(Math.random() * 6); document.getElementById('condice').innerHTML = (dice + 1); } |
このように、Math.random関数の場合は、
1 |
Math.floor(Math.random() * 6); |
と書くことで、0~5までの数字をランダムに1つ、選び出すことができます。
Math.floor()は小数点以下を切り捨てて整数にしてくれる命令文です。
1 |
document.getElementById('condice').innerHTML = (dice + 1); |
javascriptsでは数字が0から始まるため、HTMLに書き出すときに、↑のようにdice
に+1をします。
これをメルセンヌツイスターに置き換えてみましょう!
メルセンヌツイスターに置き換えてみる
まずHTMLソースです。
1 2 3 4 5 6 7 8 |
<head> <!--メタタグやタイトルタグは省略--> <script src="js/mt.js"></script> </head> <body> <input type="button" value="ダイスロール" onclick="getDice();"> <span id="condice"></span> </body> |
3行目の黄色でマークした列のように、headタグ内でmt.js
を読み込みます。
mt.jsは
http://homepage2.nifty.com/magicant/sjavascript/mt.html
↑こちらのサイトからDLし、適当な階層に置いてください。
この場合は、このHTMLファイルと同じ階層にある、jsフォルダの中に入れています。
次にjavascriptsです。
1 2 3 4 5 |
function getDice() { var mt = new MersenneTwister(); var dice = mt.nextInt(0, 6); document.getElementById('condice').innerHTML = (dice + 1); } |
まず2行目
1 |
var mt = new MersenneTwister(); |
↑で、メルセンヌツイスターを読み込みます。
そして3行目では、Math.random関数で
1 |
var dice = Math.floor(Math.random() * 6); |
と書いていたところを、
1 |
var dice = mt.nextInt(0, 6); |
と書き換えます!
これで、0 以上 6 未満の整数、つまり0~5までの数字をランダムに1つ、選び出すことができます。整数なのでMath.floorは不要です。
HTMLに書き出すときには、Math.random関数で書いていたときと同様に、+1をして1~6の数字にします。
このように、手軽に偏りのないランダムな数字を呼び出すことができました!
書き換え方を教えてくださった知り合いのエンジニアさんに感謝\(^o^)/
【PR】当サイトにはアフィリエイト広告が含まれています。
コメント