只有完全可靠的答案,提供完全随机性,没有损失。在此答案之前的其他答案都根据您想要的字符数而丢失。你想要的越多,他们就越失去随机性。
他们通过限制固定长度之前可能的数字数量来实现它。
例如,固定长度为 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^ n之前的数字是不可能的之外,这还增加了10%的损失。
现在总共是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