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クラスの実行
実行結果は,オリジナルと厳密に一致しています.オリジナルのソースコードと実行結果は以下です.
・メルセンヌツイスタオリジナルのソースコード
・オリジナルの実行結果
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
【関連記事】
・パスワード自動生成
・あなたのオリジナルパスワードを作成
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
【関連記事】
・パスワード自動生成
・あなたのオリジナルパスワードを作成

