親方、空から覚え書きが!でタグ「JavaScript」が付けられているもの

とっても速い擬似乱数生成器。Xorshift RNGs - lucille development blog 辺りを参考に。周期も適当に長く取れるので、再現性が必要なゲームにいいかもね。データの動的生成にも使えるかな?

(function (namespace) {
/**
* Xorshift128 の新しいインスタンスを初期化します。
*
* @param Number x 種その1。
* @param Number y 種その2。
* @param Number z 種その3。
* @param Number w 種その4。
*/
namespace.Xorshift128 = function (x, y, z, w)
{
var u = void(0);
this.x = x === u ? 123456789 : 0 + x;
this.y = y === u ? 362436069 : 0 + y;
this.z = z === u ? 521288629 : 0 + z;
this.w = w === u ? 88675123 : 0 + w;

if ((this.x | this.y | this.z | this.w) == 0)
{
throw new Error("x, y, z, w 全部 0 は、らめ!");
}
}

/**
* 0 以上 1 未満の乱数を返します。
*
* @return Number 0 以上 1 未満の値。
*/
namespace.Xorshift128.prototype.next = function ()
{
return this.nextUInt32() / 4294967296;
}

/**
* 0 以上 4294967296 未満の乱数を返します。
*
* @return Number 0 以上 4294967296 未満の値。
*/
namespace.Xorshift128.prototype.nextUInt32 = function ()
{
var t = this.x ^ this.x << 11;
this.x = this.y;
this.y = this.z;
this.z = this.w;
this.w = (this.w ^ this.w >>> 19) ^ (t ^ t >>> 8);

return this.w >>> 0;
}
})(window);

///////////////////////////////////////////////
var xs = new Xorshift128();
xs.next();
xs.nextUInt32();

IE だけグローバル オブジェクトのプロトタイプ オブジェクトが違うというお話です。

Object.prototype.isPrototypeOf(window);
// IE 6: false
// IE 7: false
// Firefox 2.0.0.12: true
// Opera 9.2.6: true
// Safari 3.0.4b: true

Object.prototype に毛を生やしても IE だけ影響を受けませんね。ECMA 262 3rd edition の仕様ではグローバル オブジェクトのプロトタイプ オブジェクトは実装依存だそうです。

また、window に特定のプロパティがあるかどうか知りたい場合に上記の理由で window.hasOwnProperty() とする事が出来ないので…

window.hasOwnProperty("undefined");
// IE: エラー「オブジェクトでサポートされていないプロパティまたはメソッドです。」
// Firefox 2.0.0.12: true
// Opera 9.2.6: false
// Safari 3.0.4b: true

Function#call() または Function#apply() を利用することになります。

Object.prototype.hasOwnProperty.call(window, "undefined");
// IE 6: true
// IE 7: true
// Firefox 2.0.0.12: true
// Opera 9.2.6: false
// Safari 3.0.4b: true