JavascriptとPerlの両方で再現できる乱数が作りたいです。 – とれまが知恵袋

一問一答!ひとりの疑問はみんなの疑問!とれまが知恵袋

とれまが – 個人ブログがポータルサイトに!みんなでつくるポータルサイト。とれまが知恵袋
とれまが > 知恵袋  > コンピュータテクノロジー > プログラミング > JavaScript

JavascriptとPerlの両方で再現できる乱数が作りたいです。

JavascriptとPerlの両方で再現できる乱数が作りたいです。 Perl側の場合、srand 12345;で初期化してから乱数を生成したとき、
int(rand 100); #実行結果41
int(rand 100); #実行結果29
int(rand 100); #実行結果5
int(rand 100); #実行結果88
int(rand 100); #実行結果13
だった場合、再度srand 12345;で初期化してから乱数生成すると
int(rand 100); #実行結果41
int(rand 100); #実行結果29
int(rand 100); #実行結果5
int(rand 100); #実行結果88
int(rand 100); #実行結果13
というように、初期化した後は同じ結果になるじゃないですか。

そこでなんですが、特定の数値で初期化すればjavascriptとperlのどちらで実行しても同じ結果が得られるような乱数を生成できる関数ってありませんか?

私個人では、md5ハッシュという再現性があり不規則な文字列を生成する関数を両方の言語で見つけたので、これを使って、特定の数値から生成したmd5ハッシュの中の数字同士で四則演算させ、その計算結果からまた新たなmd5ハッシュを作る、といった循環により再現性のある乱数が作れるかなとか思ったんですけど、なかなか数値がばらつかなくて挫折したところです。

難しく考えなくても、javascript限定の関数やperl限定の関数を必要としない乱数生成方法などお教え頂ければ・・・。

質問日時:2017年03月19日 16時16分
解決日時:2017年03月19日 22時26分

"メルセンヌツイスター"という乱数発生アルゴリズムを使うと良いと思います。
乱数として非常に優秀な上にアルゴリズムも広く知られています。

Perlでは Math::Random::MT としてメルセンヌツイスターが使用できます。
ソースコードは以下のような感じです。

use Math::Random::MT qw(srand rand irand);

srand(123);
foreach (1 .. 10) {
    my $num = irand();
    print "PL $_ $num\n";
}
--- 実行結果 ---
PL 1 2991312382
PL 2 3062119789
PL 3 1228959102
PL 4 1840268610
PL 5 974319580
PL 6 2967327842
PL 7 2367878886
PL 8 3088727057
PL 9 3090095699
PL 10 2109339754



JavaScriptでもメルセンヌツイスターが使用できるようにと、誰かが作ったクラス(https://magicant.github.io/sjavascript/mt.js)があります。
それを使用すると同じシードでPerlと同じ乱数生成が出来ると思います。
ソースコードは以下です。

<script type="text/javascript" src="https://magicant.github.io/sjavascript/mt.js"></script>

<script>
var mt = new MersenneTwister(123);
for (var i=1; i<=10;i ++) {
    console.log("JS " + i + " " + mt.nextInt());
}
</script>
--- 実行結果 ---
JS 1 2991312382
JS 2 3062119789
JS 3 1228959102
JS 4 1840268610
JS 5 974319580
JS 6 2967327842
JS 7 2367878886
JS 8 3088727057
JS 9 3090095699
JS 10 2109339754

回答日時:2017年03月19日 19時20分

オススメワード

ビジネスワード

気になるワード

powerd by Yahoo!知恵袋

Copyright (C) 2006-2013 sitescope co.,ltd. All Rights Reserved.