我正在尝试生成一个必须具有正好 6 位数字的固定长度的随机数。
我不知道下面给出的 JavaScript 是否会创建一个小于 6 位的数字?
Math.floor((Math.random()*1000000)+1);
我在 StackOverflow here 上找到了这个问题和答案。但是,还不清楚。
编辑:我多次运行上述代码,是的,它经常创建少于 6 位的数字。有没有一种快速/快速的方法来确保它始终是 6 位数字?
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
return ("" + number).substring(0, length);
我会选择这个解决方案:
Math.floor(Math.random() * 899999 + 100000)
900000
而不是 899999
因为 Math.rand() 将返回范围 [0,1[ 中的数字,这意味着 0 包括在内,1 不包括在内,因此它永远不会等于 1,如 here 所述
更一般地,可以使用 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);
您可以使用以下代码生成一个始终为 6 位的随机数:
Math.random().toString().substr(2, 6)
希望这对每个人都有效:)
简而言之,它的工作原理是 Math.random()
生成一个介于 0 和 1 之间的随机数,我们将其转换为字符串并使用 .toString()
并使用 .substr()
和参数 2, 6
从所述字符串中获取 6 位样本以启动样本从第二个字符开始并继续 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
0.5
你将得到 1 位数的结果
Math.random().toString().substr(2, 6).repeat(6).substr(2, 6);
@KamilKiełczewski
padStart
设置为所需的长度。
任意精度的短
下面的代码总是生成带有 n
位数字的字符串 - 片段中的解决方案使用它
[...Array(n)].map(_=>Math.random()*10|0).join``
let gen = n=> [...Array(n)].map(_=>Math.random()*10|0).join`` // TEST: 生成 6 位数字 // 第一个数字不能为零 - 所以我们单独生成它 let SixDigitStr = (1+Math.random()*9|0) + gen(5) console.log( +(sixDigitStr) ) // + 转换为 num
100000 + Math.floor(Math.random() * 900000);
将给出一个从 100000 到 999999(含)的数字。
Math.random()
返回 1,此解决方案可能会产生 1000000,这是一个 7 位数字。
根据您提供的链接,正确答案应该是
Math.floor(Math.random()*899999+100000);
Math.random() 返回介于 0 和 1 之间的浮点数,因此最小数字为 100000,最大 - 999999。正好是 6 位,如您所愿 :)
这是我使用的功能。 n - 要生成的字符串长度
函数 generateRandomNumber(n) { return Math.floor(Math.random() * (9 * Math.pow(10, n - 1))) + Math.pow(10, n - 1); }
这是我经常使用的另一个随机数生成器,它还可以防止第一个数字为零(0)
函数 randomNumber(length) { var text = ""; var 可能 = "123456789"; for (var i = 0; i < length; i++) { var sup = Math.floor(Math.random() * possible.length);文本 += i > 0 && sup == i ? "0" : 可能的.charAt(sup); } 返回数字(文本); }
let length = 6;
("0".repeat(length) + Math.floor(Math.random() * 10 ** length)).slice(-length);
Math.random()
- 返回 0 - 1 之间的浮点数
10 ** length
- 将它乘以长度,这样我们就可以得到 1 - 6 个带小数的长度数字
Math.floor()
- 将上述数字返回为整数(给定数字的最大整数)。
如果我们得到少于 6 位的数字怎么办?
这就是为什么您必须附加 0
的原因。 "0".repeat()
重复给定的字符串 0
所以我们可能会得到超过 6 位的数字,对吧?这就是我们必须使用 "".slice()
方法的原因。它返回给定索引内的数组。通过给出负值,它从最后一个元素开始计数。
我创建了以下函数来生成固定长度的随机数:
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 以使数字的长度符合要求。
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')
!: 特殊字符 (~!@#$%^&()_+-={}[];\',.)
*:所有字符(以上所有字符的组合)
?:自定义字符(将一串自定义字符传递给选项)
我使用 randojs 使随机性更简单、更易读。您可以使用 randojs 像这样在 100000 和 999999 之间选择一个随机整数:
控制台.log(rando(100000, 999999));
我今天也在考虑同样的问题,然后提出解决方案。
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));
这段代码提供了几乎完全的随机性:
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;控制台.log(数字);
这可能是最简单且可靠的方法。
对于 6 的长度,递归并不重要。
function random(len) { let result = Math.floor(Math.random() * Math.pow(10, len));返回 (result.toString().length < len) ?随机(len):结果; } 控制台日志(随机(6));
如果您还希望第一个数字能够为 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())
生成一个固定长度为 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 位的随机数:
console.log(Math.floor(Math.random() * 900000));
结果 = 500229
生成一个 4 位随机数:
console.log(Math.floor(Math.random() * 9000));
结果 = 8751
0.00001
结果将只有 1 位
您可以使用此模块 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
希望这对你有用 :)
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
.
不定期副业成功案例分享
0 - 0.9999999999999999
所以.. 它不会达到 7 位数。console.log(Math.floor(100000 + 0 * 900000)); = 100000
console.log(Math.floor(100000 + 0.9999999999999999 * 900000)); = 999999