如何使用JavaScript生成固定长度的随机数?

2022-08-30 05:12:32

我正在尝试生成一个随机数,该随机数必须具有恰好6位数字的固定长度。

我不知道JavaScript下面给出的是否会创建一个小于6位的数字?

Math.floor((Math.random()*1000000)+1);

我在这里的StackOverflow上找到了这个问题和答案。但是,目前还不清楚。

编辑:我运行了上面的代码很多次,是的,它经常创建小于6位的数字。有没有一种快速/快速的方法来确保它始终是6位数字?


答案 1

console.log(Math.floor(100000 + Math.random() * 900000));

将始终创建 6 位数字,并确保第一个数字永远不会是 0。您的问题中的代码创建少于6位数字的数字。


答案 2

只有完全可靠的答案,提供完全随机性,没有损失。在此答案之前的其他答案都根据您想要的字符数而丢失。你想要的越多,他们就越失去随机性。

他们通过限制固定长度之前可能的数字数量来实现它。

例如,固定长度为 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