LCOV - code coverage report
Current view: top level - src/core/prng - xor.js (source / functions) Hit Total Coverage
Test: cov_profile.lcov Lines: 46 47 97.9 %
Date: 2021-12-16 00:47:58 Functions: 7 7 100.0 %
Branches: 4 4 100.0 %

           Branch data     Line data    Source code
       1                 :         48 : // xorshift128 variation of https://en.wikipedia.org/wiki/Xorshift
       2            [ + ]:         48 : 
       3                 :         48 : const baseSeeds = [123456789, 362436069, 521288629, 88675123];
       4                 :         48 : 
       5                 :         48 : const xor = (seed) => {
       6                 :      19460 :   let [x, y, z, w] = baseSeeds;
       7                 :      19460 : 
       8                 :      19460 :   // const random = ()=>([x,y, z, w] = [y, z, w, w ^ w >> 19 ^ x ^ x << 11 ^ (x ^ x << 11) >> 8]) && w / 0x7fffffff
       9                 :      19460 :   const random = () => {
      10                 :     128358 :     const t = x ^ (x << 11);
      11                 :     128358 :     [x, y, z] = [y, z, w];
      12                 :     128358 :     w = w ^ (w >> 19) ^ t ^ (t >> 8);
      13                 :     128358 :     return w / 0x7fffffff;
      14                 :      19460 :   };
      15                 :      19460 : 
      16                 :      19460 :   // https://stackoverflow.com/q/31513168/665261
      17                 :      19460 :   // const reverse = t => ([w, z, y, x] = [z, y, x, (t = w ^ z ^ z >> 19, t ^= t >> 8, t ^= t >> 16, t ^= t << 11, t ^ t << 22)]) && w / 0x7fffffff
      18                 :      19460 :   const reverse = () => {
      19                 :      23484 :     let t = w ^ z ^ (z >> 19);
      20                 :      23484 :     t = t ^ (t >> 8);
      21                 :      23484 :     t = t ^ (t >> 16);
      22                 :      23484 :     t = t ^ (t << 11);
      23                 :      23484 :     t = t ^ (t << 22);
      24                 :      23484 :     [w, z, y] = [z, y, x];
      25                 :      23484 :     x = t;
      26                 :      23484 :     return w / 0x7fffffff;
      27                 :      19460 :   };
      28                 :      19460 : 
      29                 :      19460 :   const seeder = () => Math.round(random() * 1e16);
      30                 :      19460 : 
      31                 :      19460 :   const setSeeds = (seed) => {
      32                 :      40362 :     [x, y, z, w] = baseSeeds.map((i) => i + seed);
      33            [ + ]:      40362 :     [x, y, z, w] = [seeder(), seeder(), seeder(), seeder()];
      34                 :      19460 :   };
      35                 :      19460 : 
      36                 :      19460 :   setSeeds(seed);
      37                 :      19460 : 
      38                 :      19460 :   return {
      39                 :      19460 :     random: () => random(),
      40            [ + ]:          0 :     reverse: () => reverse(),
      41            [ + ]:      19460 :     reseed: setSeeds,
      42                 :      19460 :     getState: () => [x, y, z, w],
      43                 :      19460 :     setState: (seeds) => ([x, y, z, w] = seeds),
      44                 :      19460 :   };
      45                 :         48 : };
      46                 :         48 : 
      47                 :         24 : export default xor;

Generated by: LCOV version 1.15