This version of the generator creates a random integer. It can deal with very large integers up to a few thousand digits.
(function(){
function initRng(){
function randUnit(){
if(window.crypto && crypto.getRandomValues){
const u=new Uint32Array(1); crypto.getRandomValues(u);
return u[0]/4294967296;
}
return Math.random();
}
function randInt(min,max){
min=Math.ceil(min); max=Math.floor(max);
const range=max-min+1;
if(range<=0) throw new Error("bad range");
if(window.crypto && crypto.getRandomValues){
const maxUint=0xFFFFFFFF;
const limit=Math.floor(maxUint/range)*range;
const u=new Uint32Array(1);
let x;
do{ crypto.getRandomValues(u); x=u[0]; }while(x>=limit);
return min+(x%range);
}
return min+Math.floor(Math.random()*range);
}
function swap(a,b){ return a<=b ? [a,b] : [b,a]; }
document.querySelectorAll(".rng-wrap").forEach((wrap, idx) => {
// Unique radio groups
wrap.querySelectorAll(‘input[type=”radio”][data-type]’).forEach(r => {
r.name = “rngType_” + idx;
});
wrap.querySelectorAll(“[data-rng]”).forEach(section => {
const lowEl = section.querySelector(“[data-low]”);
const highEl = section.querySelector(“[data-high]”);
const resultEl = section.querySelector(“[data-result]”);
const errEl = section.querySelector(“[data-error]”);
const countEl = section.querySelector(“[data-count]”);
const precEl = section.querySelector(“[data-precision]”);
const isComp = section.getAttribute(“data-rng”) === “comp”;
const setError = (m)=> errEl.textContent = m || “”;
const setResult = (t)=> resultEl.textContent = t;
section.querySelector(“[data-generate]”).addEventListener(“click”, () => {
setError(“”); setResult(“—”);
const low = Number(lowEl.value);
const high = Number(highEl.value);
if(!Number.isFinite(low) || !Number.isFinite(high)){
setError(“Please enter valid numbers for both limits.”);
return;
}
const [a,b] = swap(low,high);
try{
if(!isComp){
setResult(String(randInt(a,b)));
return;
}
const count = Number(countEl.value);
const precision = Number(precEl.value);
if(!Number.isFinite(count) || count<1 || count>1000){
setError(“Generate count must be between 1 and 1000.”);
return;
}
if(!Number.isFinite(precision) || precision<0 || precision>200){
setError(“Precision must be between 0 and 200 digits.”);
return;
}
const type = section.querySelector(‘input[type=”radio”][data-type]:checked’)?.value || “decimal”;
const out = [];
if(type === “integer”){
const minI = Math.ceil(a), maxI = Math.floor(b);
if(minI > maxI){
setError(“For integers, limits must include at least one whole number.”);
return;
}
for(let i=0;i
{
if(!isComp){
lowEl.value = 1; highEl.value = 100;
} else {
lowEl.value = 0.2; highEl.value = 112.5;
countEl.value = 1; precEl.value = 50;
section.querySelector(‘input[value=”decimal”][data-type]’).checked = true;
}
setResult(“—”);
setError(“”);
});
});
});
}
// Run after everything + Elementor frontend
if(document.readyState === “loading”){
document.addEventListener(“DOMContentLoaded”, initRng);
} else {
initRng();
}
// Elementor sometimes loads content dynamically
window.addEventListener(“elementor/frontend/init”, initRng);
})();