只有完全可靠的答案才能提供完全随机性,而不会丢失。此答案之前的其他人都会根据您想要的字符数而丢失。你想要的越多,他们就越失去随机性。
他们通过限制固定长度之前可能的数字数量来实现。
例如,固定长度 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; // 12 is the min safe number Math.random() can generate without it starting to pad the end with zeros.
if ( n > max ) {
return generate(max) + generate(n - max);
}
max = Math.pow(10, n+add);
var min = max/10; // Math.pow(10, n) basically
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