Javaでunsignedがないのは不便?

Javaで符号無し整数がないと移植の時に困ると言うのを突如認識するはめに.

Mersenne Twister由来の並列対応エンジンであるDynamic CreatorJavaに移植しようとソースコードを除いてみたら,当然のごとくunsigned intのあらし.元のMersenne Twisterからが基本unsigned intを使用してる.で,頭が痛いのはこれをどうやってJavaで実装するか.

参考にするために,Javaに移植されたMersenne Twisterのコードを眺めると(colt, 検索で引っかかるMersenneTwisterFast,奥村先生他著のJavaによるアルゴリズム辞典),どれも符号ありと無しの区別に関しては無視を決め込んでいる.これで問題がなければいいのだけど,少なくとも無視を決め込むと同じ種で初期化しても違う乱数が生成されることになる(実際に,mt19937ar.cとcern.jet.random.engine.MersenneTwister.javaで比較してみると全然違う).

これがどの程度の問題になるのかが見えてこないのだけど(世間的に許容されていると言うことは乱数としての統計には問題はないのだろう),Dynamic Creatorの場合にはどこかでmt19937.cで生成した乱数を使って種を決めているような気配があるので,やばそうだし,それ以上に複雑でかつ時間のかかる計算をしているのでunsigned intを無視すると手ひどいことになりそう.

追記

といっても,unsignedやsignedといっても,しょせん補数表示なわけだからビットとしては右シフトをきちんと論理シフトにすることさえ徹底すれば問題なさげなんだが,何で結果が違ってくるんだろ.

ちょっと計算し直し.

追記2

coltはビットシフトが全部算術シフトなのでおかしい.MersenneTwisterFastはちゃんと論理シフトになってるけど,初期化のアルゴリズムが古い.Javaによるアルゴリズム辞典はちゃんと論理シフトになってるし,初期化のアルゴリズムも最新版なのでOK.coltは他にもぞっとするようなコードが所々あって困る