Случайная буквенно-цифровая строка в JavaScript? [Дубликат]

На этот вопрос уже есть ответ:

Генерировать случайные строки / символы в JavaScript 61 ответ

Какой самый короткий (в пределах разумного) способ генерирования случайной буквенно-цифровой (прописные, строчные и цифры) строки в JavaScript для использования в качестве, вероятно, уникального идентификатора?

 Neal23 мая 2012 г., 22:04
@ Павел, вот что такое код-гольф ....
 Greg Hewgill23 мая 2012 г., 21:55
Самый короткий путь? Это вопрос кода в гольф?
 mikemaccana09 янв. 2016 г., 17:53
@ neal Удаление избыточности - это хорошая инженерная практика, Code Golf пишет наименьшее количество кода (часто с использованием односимвольных переменных, побочных эффектов и других плохих практик). Они похожи, но очень разные.
 Sony Mathew24 июл. 2014 г., 07:42
 Pavel23 мая 2012 г., 22:02
Ахах нет! Это не соревнование для тех, кто может упаковать свой код максимально плотно. Я видел некоторые решения, которые перечисляют весь набор символов в строке, которая казалась расточительной. Просто ищу что-то не намного дольше, чем нужно.

Ответы на вопрос(17)

основываясь на том, что предложил Джар Джар, я использовал это в недавнем проекте (чтобы преодолеть ограничения по длине):

var randomString = function (len, bits)
{
    bits = bits || 36;
    var outStr = "", newStr;
    while (outStr.length < len)
    {
        newStr = Math.random().toString(bits).slice(2);
        outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
    }
    return outStr.toUpperCase();
};

USE:

randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters

для случайных 20 символов (буквенно-цифровой строчной буквы):

_.times(20, () => _.random(35).toString(36)).join('');

для 32 символов:

for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
function randomString(len) {
    var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
    return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}

Резюме

Создайте массив нужного нам размера (потому что нетrange(len) эквивалент в javascript. Для каждого элемента в массиве: выберите случайный символ изp и добавь его в строку Возврат созданной строки.

Некоторое объяснение:

[...Array(len)]

Array (len) или новый Array (len) создает массив с неопределенными указателя. С одной строчкой будет сложнее справиться. Распространенный синтаксис удобно определяет указатели (теперь они указывают на неопределенные объекты!).

.reduce(

Уменьшить массив, в данном случае, единственная строка. Сокращенная функциональность характерна для большинства языков и стоит учиться.

a=>a+...

Мы используем стрелка функция.

a это Аккумулятор. В этом случае это строка конечного результата, которую мы собираемся вернуть, когда закончим (вы знаете, что это строка, потому что второй аргумент функции Reduce,Начальное значени - пустая строка:''). Итак, в основном: преобразовать каждый элемент в массиве с помощьюp[~~(Math.random()*p.length)], добавить результат кa нанизывай и дай мнеa когда вы закончите

p[...]

p - это строка символов, из которых мы выбираем. Вы можете получить доступ к символам в строке, такой как индекс (например,"abcdefg"[3] дает нам"d")

~~(Math.random()*p.length)

Math.random() возвращает плавающую точку между [0, 1)Math.floor(Math.random()*max) является стандартом де-факто для получения случайного целого числа в javascript. ~ - это побитовый оператор НЕ в JavaScript.~~ короче, возможно, иногда быстрее, и определенно веселее сказатьMath.floor( Вот немного информации

 Badacadabra21 июн. 2017 г., 22:09
Пока этот код может ответить на вопрос, предоставляя дополнительный контекст относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.

let len = 20, str = "";
while(str.length < len) str += Math.random().toString(36).substr(2);
str = str.substr(0, len);

Это чище

Math.random().toString(36).substr(2, length)

Приме

Math.random().toString(36).substr(2, 5)
 thailey0120 нояб. 2016 г., 22:04
Похоже, это не работает для длины> 16

ргумент @keyLength - это длина символа, которую вы хотите использовать для ключа

function keyGen(keyLength) {
    var i, key = "", characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

    var charactersLength = characters.length;

    for (i = 0; i < keyLength; i++) {
        key += characters.substr(Math.floor((Math.random() * charactersLength) + 1), 1);
    }

    return key;
}


keyGen(12)
"QEt9mYBiTpYD"

что следующее является самым простым решением, которое учитывает заданную длину:

Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')

Это зависит от синтаксиса функции стрелки.

 David Avsajanishvili08 февр. 2018 г., 05:41
Отличное решение! Действительно самый простой.

Случайный символ:

String.fromCharCode(i); //where is an int

Случайный int:

Math.floor(Math.random()*100);

Поставить все это вместе

function randomNum(hi){
    return Math.floor(Math.random()*hi);
} 
function randomChar(){
    return String.fromCharCode(randomNum(100));
}
function randomString(length){
   var str = "";
   for(var i = 0; i < length; ++i){
        str += randomChar();
   }
   return str;
}
var RandomString = randomString(32); //32 length string

Fiddle:http: //jsfiddle.net/maniator/QZ9J2

 jovan08 дек. 2014 г., 15:42
Это включает в себя целую кучу не буквенно-цифровых символов. Пример (что я получил с первой попытки):M&I56aP=H K?<T*, ;0'9_c5Tb
 RozzA18 янв. 2017 г., 22:27
я получил] 4INBKJ\`_5.(/"__X,,K"\)] многие символы не используются и были удалены SO
 JasonWoof03 апр. 2018 г., 04:12
Null bytes (String.fromCharCode (0)) вызывает всевозможные проблемы во многих языках / базах данных / средах. Коды 33-126 производят видимые символы ASCII.

я подумал, когда мне нужно было сгенерировать UUID. Я не могу взять кредит на код, так как я уверен, что нашел его здесь на stackoverflow. Если вы не хотите, чтобы в вашей строке были тире, то удалите их. Вот функция:

function generateUUID() {
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g,function(c) {
        var r = (d + Math.random()*16)%16 | 0;
        d = Math.floor(d/16);
        return (c=='x' ? r : (r&0x7|0x8)).toString(16);
    });
    return uuid.toUpperCase();
}

Fiddle:http: //jsfiddle.net/nlviands/fNPvf/11227

 nlv19 янв. 2015 г., 19:36
Конечно, вы можете сократить или удлинить строку, чтобы иметь столько символов, сколько вы хотите.
 nlv19 янв. 2015 г., 19:45
Вот где я, скорее всего, нашел код: Stackoverflow.com / а / 8809472/988540
var randomString = function(length) {
  var str = '';
  var chars ='0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'.split(
      '');
  var charsLen = chars.length;
  if (!length) {
    length = ~~(Math.random() * charsLen);
  }
  for (var i = 0; i < length; i++) {
    str += chars[~~(Math.random() * charsLen)];
  }
  return str;
};

function createRandomString(length) {
        var chars = "abcdefghijklmnopqrstufwxyzABCDEFGHIJKLMNOPQRSTUFWXYZ1234567890"
        var pwd = _.sampleSize(chars, length || 12)  // lodash v4: use _.sampleSize
        return pwd.join("")
    }
document.write(createRandomString(8))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

 Dr Hund05 окт. 2017 г., 12:03
_. образец подписи изменен в lodash v4.
 XåpplI'-I0llwlg'I -05 окт. 2017 г., 06:29
Использование lodash для генерации случайного шестнадцатеричного цвета CSS:_.sampleSize("abcdef0123456789", 6).join("")
 karliwson20 апр. 2017 г., 20:19
_.sample() возвращает только один символ. Я думаю, что вы имеете в виду_.sampleSize()
Решение Вопроса

вы можете сделать это следующим образом:

function randomString(length, chars) {
    var result = '';
    for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)];
    return result;
}
var rString = randomString(32, '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');

Вот пример jsfiddle:http: //jsfiddle.net/wSQBx

Другой способ сделать это - использовать специальную строку, которая сообщает функции, какие типы символов использовать. Вы можете сделать это так:

function randomString(length, chars) {
    var mask = '';
    if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
    if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    if (chars.indexOf('#') > -1) mask += '0123456789';
    if (chars.indexOf('!') > -1) mask += '~`[email protected]#$%^&*()_+-={}[]:";\'<>?,./|\\';
    var result = '';
    for (var i = length; i > 0; --i) result += mask[Math.floor(Math.random() * mask.length)];
    return result;
}

console.log(randomString(16, 'aA'));
console.log(randomString(32, '#aA'));
console.log(randomString(64, '#A!'));

Fiddle:http: //jsfiddle.net/wSQBx/2

В качестве альтернативы, чтобы использовать метод base36, как описано ниже, вы можете сделать что-то вроде этого:

function randomString(length) {
    return Math.round((Math.pow(36, length + 1) - Math.random() * Math.pow(36, length))).toString(36).slice(1);
}
 axelbrz06 апр. 2015 г., 12:33
Ну, здесь есть статистическая ошибка.Math.round(Math.random() * (chars.length - 1)) даст половину вероятности для[0] и для[chars.length-1] чем для остальных символов, так как для округления до них нужно соответственно число в интервалах[0, 0.5) а также[chars.length-2+0.5, chars.length-1) размером 0,5, тогда как остальным символам нужно[index-0.5, index+0.5) размера 1. Правильная функция индексации должна быть:parseInt(Math.random() * chars.length) как верхняя граница для random () исключена иchars.length не будет достигнута: W3schools.com / jsref / jsref_random.asp
 Iftah01 дек. 2015 г., 11:21
Я позволил себе исправить статистическую ошибку в коде. Потому что это лучший результат в Google для «случайной строки javascript», позор иметь ошибочный ответ.
 Matthew15 июл. 2014 г., 05:24
Мне очень нравится второй подход. Я пытался использовать его, и, кажется, есть некоторые проблемы. Как вы можете видеть изЭТ снимок экрана, иногда он генерирует строки не указанной длины. Я положил вашrandomString(..) функция вfor(var i=0;i<50;i++){}икл @, который сгенерировал 50 случайных строк, а длина последней из трех символов. Я также сказал, чтобы написать в документ 50 раз так:document.write(randomString(8, '#aA!') + "</br>");
 Nimphious24 июл. 2014 г., 15:49
@ Matthew Возможно, ваш браузер обнаружил непреднамеренный ложный тег в выходной строке. Проверьте источник вывода и посмотрите, есть ли там несколько странных символов <и>, вызывающих проблемы.
 axelbrz14 апр. 2015 г., 05:22
@ Nimphious Пожалуйста, дайте мне ваши рекомендации.Math.random() никогда не вернет 1. Возвращаемое значение в[0, 1) означает, что 0 включено, а 1 исключено. Вот четыре разных и важных независимых источника: Mozilla: Goo.gl / BQGZiG; Microsoft MSDN (IE): Goo.gl / MPuCJM; w3schools: Goo.gl / qXrK7P; Переполнение стека: Goo.gl / CUoyIT (num будучи1) а также Goo.gl / D9az3C а также Goo.gl / 0mERDq. Как вы думаете, что 1 является возможным значением для Math.random ()? Потому что это не так.

предложенный JAR.JAR.beans

(Math.random()*1e32).toString(36)

Сменой мультипликатора1e32 Вы можете изменить длину случайной строки.

 Bogdan Lewis13 июл. 2015 г., 20:55
Хороший ответ, это помогло мне. с 1e32 у меня получилось 19 символов, а с 1e64 у меня 40. Большое спасибо!
 Bogdan Lewis13 июл. 2015 г., 21:43
я понял! я искал простое решение, которое генерирует длинные случайные строки (около 40 символов)
 Abdennour TOUMI20 нояб. 2016 г., 20:25
хороший ответ. однако он не генерирует ЗАГЛАВНЫЕ (заглавные) буквы
 he-yaeh13 июл. 2015 г., 21:21
@ BogdanLewis Обратите внимание, что длина строки не гарантируется. Значение 1e64 не всегда дает строку длиной 40 символов, однако она будет близка к 40.

Math.random().toString(36).slice(2)

Примечания по этой реализации:

Это приведет к появлению строки длиной от нуля до 12 символов, обычно 11 символов, из-за того, что при строковом преобразовании с плавающей запятой удаляются завершающие нули. Он не будет генерировать заглавные буквы, только строчные буквы и цифры. Потому что случайность происходит отMath.random(), результат может быть предсказуемым и поэтому не обязательно уникальным. Даже если предположить идеальную реализацию, выходные данные имеют не более 52 битов энтропии, что означает, что вы можете ожидать дубликат после примерно 70 миллионов сгенерированных строк.
 Growler26 февр. 2015 г., 03:46
Можете ли вы объяснить, как это работает? Почему вы проходите36 вtoString?
 Chris Baker03 янв. 2013 г., 21:28
 Adrian Pronk14 мая 2014 г., 01:08
У тебя есть занятой сайт? Тогда иногда он будет генерировать случайное число меньше, чем0.000001.toString() для меньшего числа это что-то вроде3.4854687E-7 и ваша случайная буквенно-цифровая строка будет4854687E-7 который больше не является буквенно-цифровым. Это больше не соответствует требованиям ОП
 rescuecreative21 февр. 2014 г., 15:23
@ kimos Хороший улов. Один из способов решить эту проблему - просто попробовать еще раз. Например:function rStr() { var s=Math.random().toString(36).slice(2); return s.length===16 ? s : rStr(); }
 Web_Designer19 мая 2013 г., 04:57

https: //github.com/blueimp/JavaScript-MD

Кратчайший путь:

md5(Math.random())

Если вы хотите ограничить размер до 5:

md5(Math.random()).substr(0, 5)

Эта функция должна выдавать случайную строку любой длины.

function randString(length) {
    var l = length > 25 ? 25 : length;
    var str = Math.random().toString(36).substr(2, l);
    if(str.length >= length){
        return str;
    }
    return str.concat(this.randString(length - str.length));
}

Я проверил его следующим успешным тестом.

function test(){
    for(var x = 0; x < 300000; x++){
        if(randString(x).length != x){
            throw new Error('invalid result for len ' + x);
        }
    }
}

Причина, по которой я выбрал 25, заключается в том, что на практике длина строки, возвращаемой изMath.random().toString(36).substr(2, 25) имеет длину 25. Это число можно изменить по вашему желанию.

Эта функция является рекурсивной, и, следовательно, вызов функции с очень большими значениями может привести кMaximum call stack size exceeded. Из моего тестирования я смог получить строку длиной 300 000 символов.

Эту функцию можно преобразовать в хвостовую рекурсию, отправив строку функции в качестве второго параметра. Я не уверен, использует ли JS оптимизацию вызовов Tail

Ваш ответ на вопрос