Twitter

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.

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 3,92 (7 oy)
Yazıdaki kodların kalitesi Puan: 3,96 (7 oy)
İhtiyaca cevap verme Puan: 3,91 (7 oy)
Tavsiye edilebilirlik Puan: 3,66 (6 oy)
Genel değerlendirme Puan: 4,23 (7 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumlarý
  • Facebook Yorumlarý Facebook Yorumlarý
Yeni yorum yaz
Henüz bir yorum yazýlmadý. Ýlk yazan siz olabilirsiniz.