ISAAC rastgele sayı üretme algoritması (Javascr_ipt uygulaması)

ISAAC rastgele sayı üretme algoritması Javascr ipt uygulaması

ISAAC, rastgele güvenli sayı üretme algoritmasıdır. Bu yazıda javascript uygulamasını görebilirsiniz.

ISAAC algoritması, rastgele güvenli sayı üretme algoritmasıdır. Bu algoritmada hız ve güvenlik ön plandadır ve javascriptin Math.random() fonksiyonundan çok daha kaliteli rastgele sayı üretir.

ISAAC'ın açılımı; Indirection, Shift, Accumulate, Add, and Count şeklindedir.

Algoritma, 1993'te Robert J. Jenkins Jr. tarafından geliştirilmiştir.

Bu linkte çeşitli dillerdeki uygulamalarını görebilirsiniz.

Bu yazıda ise kendi projelerimde kullandığım şekliyle bu algoritmanın javascript uygulamasını paylaşmak istedim.

Javascript uygulaması şu şekilde:

var isaac = function() {
    function a(a, b) {
        var c = (a & 65535) + (b & 65535);
        return (a >>> 16) + (b >>> 16) + (c >>> 16) << 16 | c & 65535
    }

    function b() {
        for (var a = f = g = h = 0; 256 > a; ++a) e[a] = p[a] = 0;
        k = 0
    }

    function c(c) {
        function f() {
            g ^= h << 11;
            A = a(A, g);
            h = a(h, y);
            h ^= y >>> 2;
            C = a(C, h);
            y = a(y, A);
            y ^= A << 8;
            D = a(D, y);
            A = a(A, C);
            A ^= C >>> 16;
            x = a(x, A);
            C = a(C, D);
            C ^= D << 10;
            w = a(w, C);
            D = a(D, x);
            D ^= x >>> 4;
            g = a(g, D);
            x = a(x, w);
            x ^= w << 8;
            h = a(h, x);
            w = a(w, g);
            w ^= g >>> 9;
            y = a(y, w);
            g = a(g, h)
        }
        var g, h, y, A, C, D, x, w, r;
        g = h = y = A = C = D = x = w = 2654435769;
        c && "string" === typeof c && (c = c.toIntArray());
        c &&
            "number" === typeof c && (c = [c]);
        if (c instanceof Array)
            for (b(), r = 0; r < c.length; r++) p[r & 255] += "number" === typeof c[r] ? c[r] : 0;
        for (r = 0; 4 > r; r++) f();
        for (r = 0; 256 > r; r += 8) c && (g = a(g, p[r + 0]), h = a(h, p[r + 1]), y = a(y, p[r + 2]), A = a(A, p[r + 3]), C = a(C, p[r + 4]), D = a(D, p[r + 5]), x = a(x, p[r + 6]), w = a(w, p[r + 7])), f(), e[r + 0] = g, e[r + 1] = h, e[r + 2] = y, e[r + 3] = A, e[r + 4] = C, e[r + 5] = D, e[r + 6] = x, e[r + 7] = w;
        if (c)
            for (r = 0; 256 > r; r += 8) g = a(g, e[r + 0]), h = a(h, e[r + 1]), y = a(y, e[r + 2]), A = a(A, e[r + 3]), C = a(C, e[r + 4]), D = a(D, e[r + 5]), x = a(x, e[r + 6]), w = a(w, e[r + 7]), f(), e[r + 0] = g, e[r +
                1] = h, e[r + 2] = y, e[r + 3] = A, e[r + 4] = C, e[r + 5] = D, e[r + 6] = x, e[r + 7] = w;
        d();
        k = 256
    }

    function d(b) {
        var c, d, k;
        for (b = b && "number" === typeof b ? Math.abs(Math.floor(b)) : 1; b--;)
            for (h = a(h, 1), g = a(g, h), c = 0; 256 > c; c++) {
                switch (c & 3) {
                    case 0:
                        f ^= f << 13;
                        break;
                    case 1:
                        f ^= f >>> 6;
                        break;
                    case 2:
                        f ^= f << 2;
                        break;
                    case 3:
                        f ^= f >>> 16
                }
                f = a(e[c + 128 & 255], f);
                d = e[c];
                e[c] = k = a(e[d >>> 2 & 255], a(f, g));
                p[c] = g = a(e[k >>> 10 & 255], d)
            }
    }
    var e = Array(256),
        f = 0,
        g = 0,
        h = 0,
        p = Array(256),
        k = 0;
    c(4294967295 * Math.random());
    return {
        reset: b,
        seed: c,
        prng: d,
        rand: function() {
            k-- || (d(), k = 255);
            return p[k]
        },
        internals: function() {
            return {
                a: f,
                b: g,
                c: h,
                m: e,
                r: p
            }
        }
    }
}();
isaac.random = function() {
    return .5 + 2.3283064365386963E-10 * this.rand()
};

Kullanım örneği:

alert(isaac.random());

sonuçta 0 ile 1 arası bir sayı üretilir.

0.45798628870397806

0.9164378622081131

vb.

Eğer bu sayıyı 2^32 (2 üzeri 32) ile çarparsak bir tam sayı elde ederiz. Bu şekliyle de kullanabilirsiniz.

alert(4294967296 * isaac.random());

4294967296  = 2^32

örnek çıktı:

1644692667

3378519751

98742246

vb.

Sizler de projelerinizde ISAAC algoritmasını kullanarak güvenli rastgele sayılar elde edebilirsiniz.

Herkese kolay gelsin.

Wikipedia sayfasına buradan ulaşabilirsiniz.