我正在尝试生成一个随机数,该随机数必须具有精确的6位数字的固定长度。
我不知道下面给出的JavaScript是否会创建少于6位的数字?
Math.floor((Math.random()*1000000)+1);
我在这里在StackOverflow上找到了这个问题和答案。但是,还不清楚。
编辑:我多次运行上述代码,是的,它经常创建小于6位数字的数字。有没有一种快速/快速的方法来确保它始终是精确的6位数字?
我正在尝试生成一个随机数,该随机数必须具有精确的6位数字的固定长度。
我不知道下面给出的JavaScript是否会创建少于6位的数字?
Math.floor((Math.random()*1000000)+1);
我在这里在StackOverflow上找到了这个问题和答案。但是,还不清楚。
编辑:我多次运行上述代码,是的,它经常创建小于6位数字的数字。有没有一种快速/快速的方法来确保它始终是精确的6位数字?
Answers:
console.log(Math.floor(100000 + Math.random() * 900000));
将始终创建6位数字,并确保第一位永远不会为0。问题中的代码将创建少于6位的数字。
只有完全可靠的答案才能提供完全的随机性,而不会造成损失。在此答案之前的所有其他字符都会根据您需要的字符数而松散。您想要的越多,他们失去的随机性就越多。
他们通过限制固定长度之前可能的数量来实现这一目标。
因此,例如,固定长度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
更一般而言,可以使用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);
根据您提供的链接,正确答案应为
Math.floor(Math.random()* 899999 + 100000);
Math.random()返回的浮点数介于0和1之间,因此最小数字为100000,最大为999999。正好是您所需要的6位:)
100000 + Math.floor(Math.random() * 900000);
会给出一个介于100000到999999(含)之间的数字。
Math.random()
返回1,则此解决方案可能会产生1000000,这是一个7位数字。
这是我经常使用的另一个随机数生成器,它还可以防止第一个数字为零(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);
}
npm install --save randomatic
var randomize = require('randomatic');
randomize(pattern, length, options);
例:
要使用所有可用字符生成10个字符的随机字符串:
randomize('*', 10);
//=> 'x2_^-5_T[$'
randomize('Aa0!', 10);
//=> 'LV3u~BSGhw'
a:小写字母字符(abcdefghijklmnopqrstuvwxyz'
A:大写字母字符(ABCDEFGHIJKLMNOPQRSTUVWXYZ')
0:数字字符(0123456789')
!:特殊字符(〜!@#$%^&()_ +-= {} []; \',.)
*:所有字符(以上所有字符的总和)
?:自定义字符(将一串自定义字符传递给选项)
我今天也在考虑相同的问题,然后再提出解决方案。
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;
};
让我知道它是否有任何错误。谢谢。
这段代码提供了几乎完全的随机性:
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);
这可能是最简单且可靠的方法。
如果您还希望第一个数字能够为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())
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()
并使用.substr()
带有参数的参数从该字符串中获取6位数字的样本2, 6
从第二个字符开始该样本并继续进行6个字符。
可以用于任何长度的数字。
如果您想对此进行更多阅读,这里有一些指向文档的链接,以节省您的搜索时间:
Math.random()
:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Math/random
.toString()
:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
.substr()
:https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/substr
parseInt(Math.random().toString().slice(2,Math.min(length+2, 18)), 10); // 18 -> due to max digits in Math.random
更新:此方法有几个缺陷:-有时,如果数字的左边用零填充,则位数可能会减少。
Math.random()
可能恰好返回0或1,然后将它们转换为字符串'0'
或'1'
,然后.slice(2, ...)
返回空字符串,然后parseInt()
返回NaN
。
您可以使用此模块https://www.npmjs.com/package/uid,它会生成可变长度的唯一ID
uid(10) => "hbswt489ts"
uid() => "rhvtfnt" Defaults to 7
或者您可以查看此模块https://www.npmjs.com/package/shortid
const shortid = require('shortid');
console.log(shortid.generate());
// PPBqWA9
希望对你有帮助 :)