Graviness Blog

算数・数学・科学・電脳・雑記・アホの順の密度で記事が構成されます.
<< August 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >> ブログランキング・にほんブログ村へ
 
RECOMMEND
ビッグバン宇宙論 (上)
ビッグバン宇宙論 (上) (JUGEMレビュー »)
サイモン・シン, 青木 薫
RECENT COMMENT
  • 豊臣秀吉と曾呂利新左衛門から学ぶ数列の和
    優乃 (07/12)
  • 【誰か解いて】漸化式 a_(n+1) = f(n) * a_n ^ g(n) + h(n) の一般項
    優乃 (02/18)
  • 【誰か解いて】漸化式 a_(n+1) = f(n) * a_n ^ g(n) + h(n) の一般項
    S.S.+ (02/16)
  • 豊臣秀吉と曾呂利新左衛門から学ぶ数列の和
    坂井昭 (03/19)
  • d/dx(x↑↑n): 高さが定数のテトレーションの微分 - 数学的帰納法を用いる方法
    (09/30)
  • 全ての三角形は二等辺三角形
    優乃 (09/28)
  • 全ての三角形は二等辺三角形
    亀レス (09/28)
  • 全ての三角形は二等辺三角形
    優乃 (09/24)
  • 全ての三角形は二等辺三角形
    亀レス (09/23)
  • 【未解決】新しい演算子を創る
    $_ (09/10)
RECENT TRACKBACK
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
MersenneTwister JavaScript Version
擬似乱数 (Pseudo-random Number)生成アルゴリズムの一つであるメルセンヌ・ツイスタ (MersenneTwister)のJavaScript言語移植版を作成しました.(メルセンヌ・ツイスタの説明は,wikipediaもしくはMT考案者のウェブサイトに詳しく記載されています.)

TOPIC: MT考案者のウェブサイトからこの記事がリンクされました!ラッキー

JavaScript言語移植版のソースコードと実行結果は以下です.
メルセンヌツイスタJavaScript言語移植版ソースコード
  NOTE: Copyrightなども無修正で残してます f^^;
メルセンヌツイスタJavaScript言語移植版の実行
JavaScript言語移植版の実行結果 (FireFox3 / Windows XP)

また,JavaScript言語でクラス化したものも作成しました.
JavaScript版MersenneTwisterクラス (UTF-8)
JavaScript版MersenneTwisterクラスの実行

実行結果は,オリジナルと厳密に一致しています.オリジナルのソースコードと実行結果は以下です.
メルセンヌツイスタオリジナルのソースコード
オリジナルの実行結果
---

JavaScriptへの移植にあたって苦労した点は,論理演算です.特徴的なのは以下のような計算を行ったときです.

  var v = (32ビットを超えない大きな数);
  var t = v * v + 1; // +1が無視された値.
  ※vが一般的な言語のunsigned __int32型であれば,tは,+1も考慮された値になるはず.32ビットの整数型として,v * vでオーバーフローするのだろうか?それとも,内部で一時的に浮動小数点型になっているのでは?

  var v1 = 0xFFffFFff; // v1は,0xFFffFFffとなり,unsigned __int32型として扱われているようにみえる.
  var v2 = v1 & 0xFFffFFff; // v2は,-1となり,signed __int32型として扱われているようにみえる.
  var v3 = v2 >>> 0; // s2は,0xFFffFFffとなり,unsigned __int32型として扱われているようにみえる.
  ※表示時にどうなるかだけであって,32ビットの2の補数表現としては,どれも正しい.が,v2を使用して掛算等を行うと結果に負数が現れたりしてびっくりする.どうやら,変数を含む数値に論理演算子を適用すると,途端に32ビット整数型として扱われるようだ.

オーバーフローによって,下位桁の単純な計算が合わなくなるのは切実で,メルセンヌ・ツイスタでも“0x5D588B65”などの大きな数を掛け,その後に小さな数を足したりする箇所があります.移植時には以下のような計算で回避しました.

  元コード:
    var v = (32ビットを超えない大きな数)
    var w = 0x5D588B65 * v + 2;
  JavaScript用修正コード
    var v = (32ビットを超えない大きな数)
    var vh = (v & 0xffff0000) >>> 16, vl = v & 0xffff;
    var w = ((vh * 0x5D588B65) << 16) + (vl * 0x5D588B65) + 2

また,JavaScriptの“数値型変数”を強制的にunsigned __int32型へ変換するには,“numericVar >>>= 0”などとすると良いです.

---

Web上のインタプリタ言語を使用し,スーパーコンピュータ並のシミュレーションを行う必要がある方は参考にして下さいw
こういう数学系のネタを考えているときは,全てを忘れて没頭しているのですが,今回は,丸一日寝るのとご飯を食べるのを忘れていました.寝て起きたとき,空腹で“起き上がれない”ほど(ゲラ

---

【関連URI】
メルセンヌツイスタ考案者のウェブサイト
上記サイトのJavaScript言語移植版の紹介ページ
メルセンヌ・ツイスタ@wikipedia
メルセンヌ・ツイスタのJava言語移植版
擬似乱数@wikipedia

【関連記事】
パスワード自動生成
あなたのオリジナルパスワードを作成
コメント
コメントする









 
トラックバック
この記事のトラックバックURL
http://blog.graviness.com/trackback/795859
 

(C) 2017 ブログ JUGEM Some Rights Reserved.