Як створити випадкову кількість фіксованої довжини за допомогою JavaScript?


78

Я намагаюся сформувати випадкове число, яке має мати фіксовану довжину рівно 6 цифр.

Я не знаю, чи наведений нижче JavaScript коли-небудь створить число менше 6 цифр?

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

Я знайшов це запитання та відповідь на StackOverflow тут . Але, незрозуміло.

РЕДАГУВАТИ: Я запустив наведений код купу разів, і так, він часто створює числа менше 6 цифр. Чи є швидкий / швидкий спосіб переконатися, що це завжди рівно 6 цифр?



Привіт, хлопці, я хочу те саме із довжиною 70 цифр.
Swapnil Yeole

Відповіді:


164

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

Завжди буде створювати ряд 6 цифр , і це гарантує , що перша цифра ніколи не буде 0. Код в вашому питанні буде створювати ряд менш ніж 6 цифр.


14
Гей, ви додали хороший коментар. Я ніколи не хочу, щоб перша цифра становила 0. Хороший момент.
гіпермілер

1
@momomo how tho
Cilan

2
вам доведеться генерувати випадкове число від 0-9, n разів. див. опубліковану мною відповідь
mmm

@Doorhandle Щоб відповісти на ваше запитання про те, як, ви додаєте 100000, що слідує, означає лише можливі цифри вище. Єдиний можливий спосіб отримати справжню фіксовану довжину n без втрат - це генерувати одне число за раз, n разів. З цього також випливає, що всі числа вище 10 ^ n також неможливі. Так, наприклад, випадкове число фіксованої довжини 2 буде 10 - 99. Для 3, 100 - 999. Для 4, 1000 - 9999. Для 5 10000 - 99999 тощо. Як бачимо, це передбачає 10% втрату рандмів. Для справді великих цифр (18, 24, 48) 10% - це все ще багато цифр.
mmm

1
@momomo він конкретно каже, що це має бути 6 цифр без 0 як першого числа (див. коментар вище)
Cilan

28

Єдина повністю надійна відповідь, яка пропонує повну випадковість, без втрат. Інші до цієї відповіді втрачають, залежно від того, скільки символів ви хочете. Чим більше ви хочете, тим більше вони втрачають випадковість.

Вони досягають цього, обмежуючи кількість цифр, що може передувати фіксованій довжині.

Так, наприклад, випадкове число фіксованої довжини 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

"повинен мати фіксовану довжину рівно 6 цифр" ... "Я ніколи не хочу, щоб перша цифра була 0. Хороша точка. - гіпермілер". Я захоплююся вашою технікою та натисканням конверта, і я впевнений, що ця відповідь може бути корисною комусь іншому, але просто сказавши. Недоліком є ​​те, що ваш алгоритм є дуже рекурсивним, тому я не впевнений, що він "дозволяє ~ нескінченну довжину [...] з мінімальними витратами на продуктивність".
randomsock

@randomsock він рекурсивний, лише якщо вам потрібно більше чисел, ніж 12, і в цьому випадку він генеруватиме 12 чисел за раз. мінімальні витрати на продуктивність, так. Метою цього є використання для рядків випадкових чисел, де випадковість має значення або як виглядає вміст чи ні. нулі на початку були для нас нормальними. дійсним випадковим рядком є ​​0000000123, але це не буде генеровано в жодному з інших методів тут, крім цього.
mmm


13

Більш загально, генерація випадкового цілого числа з фіксованою довжиною може бути виконана за допомогою 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);


Найкраща і найрізноманітніша відповідь.
Ansjovis86,

Я думаю, що це не дасть якогось числа з першим заповненням, приблизно такого, як 00382. Тож це не буде абсолютно випадковим для всього діапазону.
kakadais

4

На підставі наданого вами посилання повинна бути правильна відповідь

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

Math.random () повертає плаваюче значення від 0 до 1, тому мінімальне число буде 100000, максимум - 999999. Рівно 6 цифр, як ви хотіли :)


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

дасть число від 100000 до 999999 (включно).


Ні! Це може виглядати як кутовий випадок, але якщо Math.random()повертає 1, це рішення може дати 1000000, що є 7-значним числом.
Saeed Ahadian

1
@SaeedAhadian Перевірте документи. "в діапазоні від 0 до менше 1" developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
sharoz

Влучне зауваження! Я не знав, що це не включає 1. Дякую за це.
Saeed Ahadian

2

Ось моя функція, яку я використовую. n - довжина рядка, яку потрібно створити

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


1

Це ще один генератор випадкових чисел, який я часто використовую, він також запобігає нулю першої цифри (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);
  }


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: Малі букви алфавіту (abcdefghijklmnopqrstuvwxyz '

A: Великі букви алфавіту (ABCDEFGHIJKLMNOPQRSTUVWXYZ ')

0: Цифрові символи (0123456789 ')

!: Спеціальні символи (~! @ # $% ^ & () _ + - = {} []; \ ',.)

*: Усі символи (усі перераховані вище об'єднані)

?: Спеціальні символи (передати рядок користувацьких символів параметрам)

РЕПО NPM


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 на початку, щоб зробити довжину числа за необхідності.


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;
};

Повідомте мене, якщо в ньому є помилка. Дякую.


Це справді має помилку: ви робите вдвічі більше шансів створити число між 100000 і 199999, ніж будь-яке інше число.
Г. Сліпен

0

"Створення випадкового числа за допомогою JS"

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

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

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

</body>
</html>


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



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


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


0

Я використовую randojs, щоб зробити випадковість простішою та зрозумілішою. Ви можете вибрати випадковий int між 100000 і 999999, як це за допомогою randojs:

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


0

згенеруйте випадкове число, яке має мати фіксовану довжину рівно 6 цифр:

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

2
Сподіваюся, це вирішить проблему, але, будь ласка, додайте до нього пояснення свого коду, щоб користувач отримав ідеальне розуміння того, чого він / вона насправді хоче.
Jaimil Patel

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


0

Ви можете використовувати наведений нижче код для створення випадкового числа, яке завжди буде 6 цифр:

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

Сподіваюся, це працює для всіх :)

Коротко, як це працює, Math.random()генерує випадкове число від 0 до 1, яке ми перетворюємо у рядок, використовуючи .toString()і беремо 6-значну вибірку із зазначеного рядка, використовуючи .substr()параметри, 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


-2

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

Оновлення: Цей метод має кілька недоліків: - Іноді кількість цифр може бути меншою, якщо його ліворуч заповнено нулями.


2
Це неправильно з кількох причин. Немає гарантії, що фрагмент, який ви вибираєте із рядка, не починається з нулів. Крім того, уникайте перетворення чисел у і з рядків, якщо є цілком точний спосіб вирішити проблему за допомогою звичайних математичних функцій.
Г. Сліпен

@ G.Sliepen Дякую за виправлення. На моє вивчення, чи могли б Ви також трохи детальніше розказати, чому числа не повинні бути від і до рядка? Будь-які відомі недоліки? Дякую
Кушагра Гур

1
Перетворення в і з рядків відбувається повільно, і легко забути про кутові випадки, наприклад: що, якщо число від’ємне, нульове, це число з плаваючою комою, перетворюється в експоненційне позначення тощо. Наприклад, Math.random()може повернути 0 або 1 точно, і вони будуть перетворені в рядки '0'або '1', а потім .slice(2, ...)повернуть порожній рядок, а потім parseInt()повернуть NaN.
Г. Сліпен

-2

Ви можете використовувати цей модуль https://www.npmjs.com/package/uid , він генерує унікальний ідентифікатор змінної довжини

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

Або ви можете поглянути на цей модуль https://www.npmjs.com/package/shortid

const shortid = require('shortid');

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

Сподіваюся, це працює для вас :)


@OlegMikhailov Це зараз пояснено, чи все ще не інформативно?
Судханшу Гаур
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.