Єдина повністю надійна відповідь, яка пропонує повну випадковість, без втрат. Інші до цієї відповіді втрачають, залежно від того, скільки символів ви хочете. Чим більше ви хочете, тим більше вони втрачають випадковість.
Вони досягають цього, обмежуючи кількість цифр, що може передувати фіксованій довжині.
Так, наприклад, випадкове число фіксованої довжини 2 буде 10 - 99. Для 3, 100 - 999. Для 4, 1000 - 9999. Для 5 10000 - 99999 тощо. Як видно з моделі, вона передбачає 10% втрату випадковості, оскільки цифри до цього неможливі. Чому?
Для дійсно великих цифр (18, 24, 48) 10% - це ще багато цифр, які потрібно втратити.
function generate(n) {
var add = 1, max = 12 - add;
if ( n > max ) {
return generate(max) + generate(n - max);
}
max = Math.pow(10, n+add);
var min = max/10;
var number = Math.floor( Math.random() * (max - min + 1) ) + min;
return ("" + number).substring(add);
}
Генератор забезпечує ~ нескінченну довжину без втрат точності та з мінімальними витратами на продуктивність.
Приклад:
generate(2)
"03"
generate(2)
"72"
generate(2)
"20"
generate(3)
"301"
generate(3)
"436"
generate(3)
"015"
Як бачите, навіть нуль включається спочатку, що є додатковою втратою на 10% , окрім того, що цифри до 10 ^ n неможливі.
Зараз це загалом 20%.
Крім того, інші параметри мають верхню межу кількості символів, які ви можете створити.
Приклад із вартістю:
var start = new Date(); var num = generate(1000); console.log('Time: ', new Date() - start, 'ms for', num)
Журнали:
Time: 0 ms for 7884381040581542028523049580942716270617684062141718855897876833390671831652069714762698108211737288889182869856548142946579393971303478191296939612816492205372814129483213770914444439430297923875275475120712223308258993696422444618241506074080831777597175223850085606310877065533844577763231043780302367695330451000357920496047212646138908106805663879875404784849990477942580056343258756712280958474020627842245866908290819748829427029211991533809630060693336825924167793796369987750553539230834216505824880709596544701685608502486365633618424746636614437646240783649056696052311741095247677377387232206206230001648953246132624571185908487227730250573902216708727944082363775298758556612347564746106354407311558683595834088577220946790036272364740219788470832285646664462382109714500242379237782088931632873392735450875490295512846026376692233811845787949465417190308589695423418373731970944293954443996348633968914665773009376928939207861596826457540403314327582156399232931348229798533882278769760
Більш хардкор:
generate(100000).length === 100000 -> true