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

时间:2014-02-16 21:04:37

标签: javascript random numbers

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

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

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

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

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

23 个答案:

答案 0 :(得分:67)

console.log(

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

);

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

答案 1 :(得分:13)

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

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

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

此外,其他选项对您可以实际生成的字符数有一个上限。

铁杆(笑):

generate(100000);

"0651381536751559954594864685266964793332464219914923661511711844396177002509535418334876544401924094917073213696256662736759171746155525355813820984082896909515404479432572083119349115959844601455002767695272126890943622034785199462903486615630903373736074650341933983047891115762996521811932187801517891301186904384726119762019718175435710932238346050607608330909038106079638907289974335424918916347390133250423195745981282871695914427143478015387526550643354556230557162085731499833124538228077899015387696795454233963829987328340703344884739850232366267319735437910316929832577036161160111766389779986306750540325053526332954707426521749319245685086246138852076226686592711423547069039829989359264378828053036717401113209577249028130393660800381824348578927107867412974551300511362724049498987060763708244949878691726303643609390144364016831976572032148916321330320693070018092909287513750833169369109704174178477032247944615585736953235426525770952182901723678094125452064709391262205505794896588467103839918798865986558164401714970627462474221512933182302681399770009238608569828198282594067031551589957066160459772535721218782628326984718480572065873099842295277633929431998644299592113453576385173567792887599814962391491057766181804686525454994535331956452351714080296349460787376377707332784374182769767491492626250695553656723782130680555136033698739748989110048095410831112923640685263942718951956051629868800760455527608163584040946391007996727804307183409133475760436780643452539625346136429684905697101047939193048590914919878829383906351337053184913823008300679694028703685623727771499860247737932264827173466218593294990480640551139122803223625353361708900123038017780047641220235742349899490580373913548466797570492357261650370416581586068946910750746456272020039989451556990958758038936686950664094355266620153834909274865405514128481190933769790743330654469775143510701067073238592791899235626861196974193363925127586730787377648334892346319583406971304451718976145383072306413469155987486447356622988426019558465431875505538702558565347559580202646849041387156283262505660125997956398869698806508328747714519622979932186678894485401315173760703884808651627289565546642595836542685648986064356954101696992288261891697786208558024710704710569276399395840580530230729718025713461618331061135991512805033299376252465571484999555923213609948515733572046075843375936972718778384464568891829113564444707717097719585207988502346513167888955683555484353510332395153755395909821566281989562081559052296158702137775090530683411921904165289066506048057826656008626549349520988632955599817667026102612246900688687033297726679175137756611576660839769713756589194642097257515032724723644287567807024460903027237918875450869621587384055399117177199561406778632097959377881722104757305489848832281818424422232658544588293086904471013832617620773148176645007693759497261239127503209456938874072938525618495608073774801776586228941306687157603648217719830741573207094853490260210457990217605600170536198504037929712676654872110771920253815273483354540963203021459754583032672211518949520939438225644651968189817072011400396165500599785252339489882056244086137573020347521044405459170093723855104182434230586691062441396739135676667876492508103316749255705804685196457776485441020566127708427354576129440946667137723266039252799238436908929664871559917271173890952501649969845323228911324304676033091791915543087040187338337985765900657501913326852341426754081753024526806628074157361061567145719925513947877710209406336870076364803110885165116889134514669440038093239844794417558222940044136681059927679868309962907439502915297704409286220631579548570846901779646252916735446700599319216127956590498537500296871549698551487524694730938334435602147792823774342018907256300973661332969751774453467754551030776244984673134327042549212346064016972266244421350446816023749761725326179725773631423251263241676364878077179121265520596533163857823832473659397459170863496209471969573015681099162917804608615592702751630859496460179021996381923016837765373971029344070259758032878342631664623233278865516293215903319598262833063285069029198481899370947051648391946052895356840798550825719722336591850778627364466574843889148095773261912719117480110491748466533525498678000253654834894959160056255689033940722775415886473011808596999471244206729824146278357431053778299946416560280321553991926322558288133660604761058885313628667565782057669777245228782157232415565470266425379986471558087623005877735347590673298523682042211654895539684959898310428673791086684470635130006701184979952716864452222287796185706873800126958417574002714651197052304976945291998261929510003409823301738163131184044321814967421948738077959973418977062820073272801871097791663304563677054446929522613820657158036044974077149068042264275041629991352453921603299417152412504283176126310892490074417066376036263139046485941308078474763782335271468941107500031402589191940264394201058998139384015586420043812700974998994846862783848323459027436711834029982961475394883663440929202466261118224034811753878675892626850000745927102030593859984871338541236857940137673923872330726491463521617428477728693077627246150789224577503974195294720010681235567512991787544000684873076367225265005980170732582210349335893572411614183693449732342550786984026709335344882368848483689841098289521520159842810020191403158597931892038675563703040339560051072485874177869853627258620119850024839239790991752234985493282886483878099220884607098541461828163062036559320051850664311787732545443545872718896705693074322491654059388337598948684563099349286348837258695198691715548293085118800469279568611247763603333212769696312930202331209719311698010959089495486686416701141580902003477739022656317482105542147788152780612039330285858045010109725749512856294226929278452910769275369968190680868822708154750824134942359214079088522653031930479967950106001756666750685834781326854966710709199027624399171678838338771888827826988895147799981407964765904933894198041473605722426155926472549738623915695131607125663472416755760625877192413222392834744760573194698174184828593952615330008182973235328807832466170477548637589334335253898665521398464526370554264342147842986253786980578314778173661019148173130327119873408737701145928515500658351289473328456285583253571413960151165721809937639271102772177604114259723504396074043857324876347952792500778241101315813932920875678857323985024397013308505439799092690329997846663211646708116890679317619633523367148203786872452797721688341649265556212929572302923254328310433097096422518332461522238314853608672131157398326333086636637710579603406236531242797001572404086121679806710619791401430723164752984010278279527256729659512285551846346525670396866491305030366052611420386629486883742338601295651738388001697647924588031892981500198791375362752776720252588049589262755602871270846735355848074534250430763842450204908016408980427882039831985645664399270103577548870120224819919262753016026165808042161240890128034530862386797980786530084995404258139393926242285856891852536101388461974355122811586411039593712363708990011716527704724695088670655140918478826975809560414499747323017065409019926404257362977641295374223246846824885957539038318366351775694121202206592027411031573694626783792527141205298171742811339736677829523571328298430978526492030270747840488062983567775807783758303942162746481495259894565800433588989148287828612636489953375970590336691568227027250830962451881414054532701394664621643793652659730680829782628228533496535022066254538114154750886394448619560557056090587134817765243336371995254731768578145789253081136781165232380981423661461947317624294565206639212050765935523252915568678332631643661404278947432925525662760688013716440760830951338977985068158333504142195975491474394784277375073913171986990582377987023788932860558988769345591421822956624611110395013648711595243092167162020435947799592249978899534215342536996693915479765219927236896875556418267953719666490566732043716962547762237949421980714168709049490782347854273531992819487089637953124284492758086703224352349743348457604761120733409407717030341936948166853948143433242252140863374400359359761306266558395167990712458271078696248819889876229262161656199388341741768515442688241996127565496982533125451938994200226802615272999244312311281180370991298113648307050761656528609111812818519937597989922582427406685845913968542758447240615610624851445680816432319237536466841678179826977061228472796341277749096815972710109141682142923221418300450889934793361752715170330903172203575743719842447552642209440935449303895937582103292344361773281904368852083615740443913930404143052760843333064898204276312372739440829872940436919768751089890247967337557653562879210163728376116079743767005431076841670441616652665636336229550601719325531779966031352898173391372064414093596851879022083272185840692660572194149639642073309095345114511750926138263623153925334192615658113833269237719526076431286320367730048784895945420614793303331120250754465511943883123584365330780388472745790546717486883844283359421247664497558319269087934420398659762073298209204864293120280646068964392658934917828520101658351360993611025135958090490678870508638473725333080789384783828962965033309159983224373031664875078140446422895304505649225445555564873856083488629044065544170858400698317145852209331837824336681551495069563493806386785704595613014667920738126365476692665159557868399438407300571627342425233751037082260963685748505556744991415176134639166352085172285172276758482154203549348712506151634474175365167098576444480905776241930649712981647594243229056955059691154745756909930548211510229291032212725487179388626117741684508226454916634024521067178497321754685991794920486377608095295314368866766826448127047221308873232277567988720647751988098042602089589821325908162267555756542692594698410032948436350206444474395792832337255903951405061202830201036008511147760724244082408881240159333112973046604988816375803715603929856334309755065"

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

答案 2 :(得分:10)

更一般地,生成具有固定长度的随机整数可以使用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);

答案 3 :(得分:7)

我会选择这个解决方案:

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

答案 4 :(得分:3)

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

将给出一个从100000到999999(含)的数字。

答案 5 :(得分:2)

根据您提供的链接,正确答案应为

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

Math.random()返回0到1之间的浮点数,因此最小数字将是100000,最大值 - 999999.正好6位数,如您所愿:)

答案 6 :(得分:1)

这是我使用的功能。 n-您要生成的字符串长度

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

答案 7 :(得分:0)

生成一个 6 位的随机数:

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

结果 = 500229

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

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

结果 = 8751

答案 8 :(得分:0)

您可以使用以下代码生成一个始终为6位数字的随机数:

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

希望这对所有人都有用:)

简而言之,Math.random()会生成0到1之间的随机数,我们将其转换为字符串并使用.toString(),并使用.substr()从所述字符串中提取6位数字,参数2, 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

答案 9 :(得分:0)

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()

答案 10 :(得分:0)

生成一个随机数,该随机数必须具有精确的6位数字的固定长度:

("000000"+Math.floor((Math.random()*1000000)+1)).slice(-6)

答案 11 :(得分:0)

我使用randojs使随机性更简单易读。您可以使用randojs这样在100000和999999之间选择一个随机整数:

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

答案 12 :(得分:0)

如果您还希望第一位数字能够为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())

答案 13 :(得分: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')

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

*:所有字符(以上所有字符的总和)

?:自定义字符(将一串自定义字符传递给选项)

NPM repo

答案 14 :(得分:0)

对于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));

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

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

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())

答案 17 :(得分:0)

这是我经常使用的另一个随机数生成器,它还可以防止第一个数字为零(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);
  }

答案 18 :(得分:0)

“使用JS生成随机数”

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

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

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

</body>
</html>

答案 19 :(得分: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;
};

如果有任何错误,请告诉我。感谢。

答案 20 :(得分:0)

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

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,以根据需要设置数字的长度。

答案 21 :(得分:-2)

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

更新: 这种方法有一些缺陷: -有时,如果数字的左边用零填充,数字的位数可能会减少。

答案 22 :(得分:-3)

您可以使用此模块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

希望它对您有用:)