39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
Object.defineProperty(exports, "__esModule", { value: true });
 | 
						|
exports.seededRandom = seededRandom;
 | 
						|
/**
 | 
						|
 * Computes a numeric hash from a given string
 | 
						|
 * @param {string} str A value to hash
 | 
						|
 * @returns {number} A numeric hash computed from the given value
 | 
						|
 */
 | 
						|
function xfnv1a(str) {
 | 
						|
    let h = 2166136261 >>> 0;
 | 
						|
    for (let i = 0; i < str.length; i++) {
 | 
						|
        h ^= str.charCodeAt(i);
 | 
						|
        h = Math.imul(h, 16777619);
 | 
						|
    }
 | 
						|
    return () => h >>> 0;
 | 
						|
}
 | 
						|
/**
 | 
						|
 * Initialize a new PRNG using a given seed
 | 
						|
 * @param {number} seed The seed used to initialize the PRNG
 | 
						|
 * @returns {PRNG} A random number generator
 | 
						|
 */
 | 
						|
function mulberry32(seed) {
 | 
						|
    return () => {
 | 
						|
        let t = (seed += 0x6d2b79f5);
 | 
						|
        t = Math.imul(t ^ (t >>> 15), t | 1);
 | 
						|
        t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
 | 
						|
        return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
 | 
						|
    };
 | 
						|
}
 | 
						|
/**
 | 
						|
 * Generates a PRNG using a given seed. When not provided, the seed is randomly generated
 | 
						|
 * @param {string} str A string to derive the seed from
 | 
						|
 * @returns {PRNG} A random number generator correctly seeded
 | 
						|
 */
 | 
						|
function seededRandom(str) {
 | 
						|
    const seed = str ? xfnv1a(str)() : Math.floor(Math.random() * 10_000_000_000);
 | 
						|
    return mulberry32(seed);
 | 
						|
}
 |