強火で進め このページをアンテナに追加 RSSフィード

整理された情報は こちら へどうぞ。

2011年05月21日

[]JavaScriptで疑似乱数生成法のXorshiftを実装してみた

JavaScriptでは整数が符号付き32bitで有るためにマイナスの値が発生する事が有ります。

JavaScriptで使える乱数(Math.random)は希望する乱数の種が指定出来ません。

その為、常に同じパターンの乱数を順番に欲しい様な場面には使えません。

という事でXorshiftをJavaScriptで実装してみました。

xors = {
  x: 123456789,
  y: 362436069,
  z: 521288629,
  w: 88675123
};

xors.seed = function(s) {
  xors.w = s;
}
xors.rand = function() {
  var t = xors.x ^ (xors.x << 11);
  xors.x = xors.y;
  xors.y = xors.z;
  xors.z = xors.w;
  return xors.w = (xors.w^(xors.w>>>19))^(t^(t>>>8));
}

乱数の種を設定する場合はこの様に記述、

xors.seed(123)

乱数を取得するのはこの様に記述します。

alert(xors.rand());

関連情報

Xorshift - Wikipedia

http://ja.wikipedia.org/wiki/Xorshift

(2016/01/07 追記)

Google Chromeが採用した、擬似乱数生成アルゴリズム「xorshift」の数理 – びりあるの研究ノート

https://blog.visvirial.com/articles/575

(追記ここまで)

パンダラヴァーパンダラヴァー 2014/03/11 22:39 こんにちは。
このコードを試してみたのですが、シードがシードとして機能してないように思います。例えばxors.seed(2)としてxors.rand()したら597902826とでます。しかし、xors.seed(3)としてxors.rand()しても597902826とでます。一応シードを0から1000まで試しましたがすべて597902826とでました。これはシード値として使えてないように思えます。どうなのでしょうか?

nakamura001nakamura001 2014/03/12 20:04 ご指摘ありがとうございます。

w = s;

としていたのが駄目でした。以下の様に修正して使用して下さい(本文内は修正済みです)。

xors.w = s;

zz 2014/08/30 16:00 http://ja.wikipedia.org/wiki/Xorshift の動作結果と違う数列がでてきませんか?

zz 2014/08/30 16:01 これか原因のような気がします。

「JavaScript のビット演算子に unsigned を期待してはいけない」 http://imaya.blog.jp/archives/5156823.html

nakamura001nakamura001 2014/09/03 22:22 ご指摘ありがとうございます。サンプルで使用している >> を >>> に修正しました。これで結果が整数の場合にはC言語のサンプルと同じ結果に成ったはずです。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

リンク元