for (const huser of document.querySelectorAll(".hnuser")) { const s = huser.innerText; const p = 2; const canvas = document.createElement("canvas"); const context = canvas.getContext("2d"); canvas.width = p * 7; canvas.height = p * 7; huser.parentElement.prepend(canvas); { const xorshift32 = (n) => { n ^= n << 13; n ^= n >>> 17; n ^= n << 5; return n; }; const seedSteps = 28; let seed = 1; for (let i = seedSteps + s.length; i >= seedSteps; i--) { seed = xorshift32(seed); seed += s.charCodeAt(i - seedSteps); } context.fillStyle = "#" + ((seed >> 8) & 0xffffff).toString(16).padStart(0, 6); for (let i = seedSteps - 1; i > 0; i--) { // continue the seed seed = xorshift32(seed); const X = i & 3; const Y = i >> 2; if (seed >>> (seedSteps + 1) > (X * X) / 3 + Y / 2) { context.fillRect(p * 3 + p * X, p * Y, p, p); context.fillRect(p * 3 - p * X, p * Y, p, p); } } } }
for (let i = seedSteps + s.length; i >= seedSteps; i--) to for (let i = seedSteps + s.length - 1; i >= seedSteps; i--)
The original is not using the for loop in the usual way so i starts off one smaller than expected.