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.
#isaac #rastgele #sayı-üretme #javascript