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

我试图生成一个随机数,它必须有一个固定的长度正好是6位数。

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

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

我在 StackOverflow 给你上找到了这个问题和答案。

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

218202 次浏览

我认为这个解决方案是:

Math.floor(Math.random() * 899999 + 100000)

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

Will always create a number of 6 digits and it ensures the first digit will never be 0. The code in your question will create a number of less than 6 digits.

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

编号由100000至999999(包括)。

根据你提供的链接,正确答案应该是

Math.floor(Math.random()*899999+100000);

Math.random() returns float between 0 and 1, so minimum number will be 100000, max - 999999. Exactly 6 digits, as you wanted :)

More generally, generating a random integer with fixed length can be done using Math.pow:

var randomFixedInteger = function (length) {
return Math.floor(Math.pow(10, length-1) + Math.random() * (Math.pow(10, length) - Math.pow(10, length-1) - 1));
}

回答问题: randomFixedInteger(6);


只有完全可靠的答案,提供完全随机,没有损失。在这个答案之前的其他答案都松开了,这取决于你想要多少个字符。你想要的越多,他们就越失去随机性。

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

例如,一个固定长度为2的随机数是10-99。3100-999.4,1000-9999.对于510000-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"

正如你所看到的,即使最初的0也包含在内,它是一个 附加费 10% 的损失,除此之外,10 ^ n 之前的数字是不可能的。

现在总共是 百分之二十

Also, the other options have an upper limit on how many characters you can actually generate.

成本方面的例子:

var start = new Date(); var num = generate(1000); console.log('Time: ', new Date() - start, 'ms for', num)

Logs:

Time: 0 ms for 7884381040581542028523049580942716270617684062141718855897876833390671831652069714762698108211737288889182869856548142946579393971303478191296939612816492205372814129483213770914444439430297923875275475120712223308258993696422444618241506074080831777597175223850085606310877065533844577763231043780302367695330451000357920496047212646138908106805663879875404784849990477942580056343258756712280958474020627842245866908290819748829427029211991533809630060693336825924167793796369987750553539230834216505824880709596544701685608502486365633618424746636614437646240783649056696052311741095247677377387232206206230001648953246132624571185908487227730250573902216708727944082363775298758556612347564746106354407311558683595834088577220946790036272364740219788470832285646664462382109714500242379237782088931632873392735450875490295512846026376692233811845787949465417190308589695423418373731970944293954443996348633968914665773009376928939207861596826457540403314327582156399232931348229798533882278769760

更加赤裸裸的:

generate(100000).length === 100000 -> true

我创建了下面的函数来生成固定长度的随机数:

function getRandomNum(length) {
var randomNum =
(Math.pow(10,length).toString().slice(length-1) +
Math.floor((Math.random()*Math.pow(10,length))+1).toString()).slice(-length);
return randomNum;
}

这将基本上增加0的开头,使长度的数字根据需要。

我今天也是这么想的,然后想出了解决办法。

var generateOTP = function(otpLength=6) {
let baseNumber = Math.pow(10, otpLength -1 );
let number = Math.floor(Math.random()*baseNumber);
/*
Check if number have 0 as first digit
*/
if (number < baseNumber) {
number += baseNumber;
}
return number;
};

如果有问题就告诉我,谢谢。

“使用 JS 生成随机数”

console.log(
Math.floor(Math.random() * 1000000)
);
<!DOCTYPE html>
<html>
<body>


<h2>JavaScript Math.random()</h2>


<p id="demo"></p>


</body>
</html>

您可以使用这个模块 https://www.npmjs.com/package/uid,它生成可变长度的唯一 id

uid(10) => "hbswt489ts"
uid() => "rhvtfnt" Defaults to 7

Or you can have a look at this module https://www.npmjs.com/package/shortid

const shortid = require('shortid');


console.log(shortid.generate());
// PPBqWA9

希望对你有用:)

parseInt(Math.random().toString().slice(2,Math.min(length+2, 18)), 10); // 18 -> due to max digits in Math.random

Update: 这种方法几乎没有缺陷: - 有时数字的数量可能会少,如果它的左边填充零。

这是另一个随机数发生器,我经常使用,它也防止第一个数字从零(0)

  function randomNumber(length) {
var text = "";
var possible = "123456789";
for (var i = 0; i < length; i++) {
var sup = Math.floor(Math.random() * possible.length);
text += i > 0 && sup == i ? "0" : possible.charAt(sup);
}
return Number(text);
}

这段代码提供了几乎完全的随机性:

function generator() {
const ran = () => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0].sort((x, z) => {
ren = Math.random();
if (ren == 0.5) return 0;
return ren > 0.5 ? 1 : -1
})
return Array(6).fill(null).map(x => ran()[(Math.random() * 9).toFixed()]).join('')
}


console.log(generator())

这个代码提供了完全的随机性:

function generator() {


const ran1 = () => [1, 2, 3, 4, 5, 6, 7, 8, 9, 0].sort((x, z) => {
ren = Math.random();
if (ren == 0.5) return 0;
return ren > 0.5 ? 1 : -1
})
const ran2 = () => ran1().sort((x, z) => {
ren = Math.random();
if (ren == 0.5) return 0;
return ren > 0.5 ? 1 : -1
})


return Array(6).fill(null).map(x => ran2()[(Math.random() * 9).toFixed()]).join('')
}


console.log(generator())

  var number = Math.floor(Math.random() * 9000000000) + 1000000000;
console.log(number);

这可以是最简单可靠的方法。

对于6的长度,递归性并不重要。

function random(len) {
let result = Math.floor(Math.random() * Math.pow(10, len));


return (result.toString().length < len) ? random(len) : result;
}


console.log(random(6));

下面是我的函数,我使用。 n-string 长度你想要生成

function generateRandomNumber(n) {
return Math.floor(Math.random() * (9 * Math.pow(10, n - 1))) + Math.pow(10, n - 1);
}

npm install --save randomatic


var randomize = require('randomatic');
randomize(pattern, length, options);

例如:

使用所有可用字符生成10个字符的随机字符串:

randomize('*', 10);
//=> 'x2_^-5_T[$'


randomize('Aa0!', 10);
//=> 'LV3u~BSGhw'

A: 小写字母(ISO基础拉丁字母表)

答: 大写字母(ISO基础拉丁字母表)

0: 数字字符(0123456789’)

: 特殊字符(~ !@# $% ^ & () _ +-= {}[] ;’,.)

* : 所有字符(以上所有字符合并)

? : 自定义字符(向选项传递一个自定义字符串)

NPM 回购

如果你也希望第一个数字能为0,这就是我的解决方案:

const getRange = (size, start = 0) => Array(size).fill(0).map((_, i) => i + start);


const getRandomDigit = () => Math.floor(Math.random() * 10);


const generateVerificationCode = () => getRange(6).map(getRandomDigit).join('');


console.log(generateVerificationCode())

我使用 randojs使随机性更简单,更易读。你可以在100000到999999之间随机选择一个整型数,就像这样使用 randojs:

console.log(rando(100000, 999999));
<script src="https://randojs.com/1.0.0.js"></script>

生成一个固定长度为6位数的随机数:

("000000"+Math.floor((Math.random()*1000000)+1)).slice(-6)
const generate = n => String(Math.ceil(Math.random() * 10**n)).padStart(n, '0')
// n being the length of the random number.

如果需要整数,则在结果上使用 parseInt()Number()。 如果您不希望第一个整数为0,那么您可以使用 padEnd()而不是 padStart()

你可以使用下面的代码生成一个6位数的随机数:

Math.random().toString().substr(2, 6)

希望这对每个人都有用:)

简单来说,就是 Math.random()生成一个介于0和1之间的随机数,我们将它转换成一个字符串并使用 .toString(),然后使用带有参数 2, 6.substr()从这个字符串中取出一个6位数的样本,从第2个字符开始取样,然后继续取6个字符。

这可以用于任何长度的数字。

如果你想在这方面做更多的阅读,这里有一些链接到文档,以节省你一些谷歌:

Math.random(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random

.toString(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

.substr(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

生成一个6位数的随机数:

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

Result = 500229

生成一个4位数的随机数:

console.log(Math.floor(Math.random() * 9000));

结果 = 8751

let length = 6;
("0".repeat(length) + Math.floor(Math.random() * 10 ** length)).slice(-length);

返回0-1之间的浮点数

乘以它的长度,这样我们可以得到1-6长度的数字与小数

返回以上数字为整数(给定数字的最大整数)。

如果我们得到的数字小于6位呢?

这就是为什么必须附加 0的原因。 "0".repeat()重复给定的字符串 0

所以我们可能会得到超过6个数字,对吗? 这就是为什么我们必须使用 "".slice()方法。它返回给定索引内的数组。通过给出负值,它从最后一个元素开始计数。

任意精度的短

下面的代码 ALWAYS 生成字符串与 n数字-解决方案在代码片段使用它

[...Array(n)].map(_=>Math.random()*10|0).join``

let gen = n=> [...Array(n)].map(_=>Math.random()*10|0).join``


// TEST: generate 6 digit number
// first number can't be zero - so we generate it separatley
let sixDigitStr = (1+Math.random()*9|0) + gen(5)
console.log( +(sixDigitStr) ) // + convert to num