javascript - 출력 - 자바스크립트 문자열 자르기




자바 스크립트에서 임의의 문자열/문자 생성 (20)

나는 [a-zA-Z0-9] 세트에서 무작위로 선택한 캐릭터들로 구성된 5 개의 문자열을 원합니다.

JavaScript로 이것을 수행하는 가장 좋은 방법은 무엇입니까?


무작위 문자열 생성기 (알파 - 숫자 | 알파 | 숫자)

/**
 * RANDOM STRING GENERATOR
 *
 * Info:      http://.com/a/27872144/383904
 * Use:       randomString(length [,"A"] [,"N"] );
 * Default:   return a random alpha-numeric string
 * Arguments: If you use the optional "A", "N" flags:
 *            "A" (Alpha flag)   return random a-Z string
 *            "N" (Numeric flag) return random 0-9 string
 */
function randomString(len, an){
    an = an&&an.toLowerCase();
    var str="", i=0, min=an=="a"?10:0, max=an=="n"?10:62;
    for(;i++<len;){
      var r = Math.random()*(max-min)+min <<0;
      str += String.fromCharCode(r+=r>9?r<36?55:61:48);
    }
    return str;
}
randomString(10);        // "4Z8iNQag9v"
randomString(10, "A");   // "aUkZuHNcWw"
randomString(10, "N");   // "9055739230"

재미있게 보내십시오. jsBin 데모

위의 경우 원하는 (A / N, A, N) 출력에 대한 추가 검사를 사용하지만 더 나은 이해를 위해 필수 요소 (영문자 만)로 나누십시오.

  • 인수 (임의의 문자열 결과의 원하는 길이)를 받아들이는 함수를 만듭니다.
  • var str = ""; 와 같이 빈 문자열을 만듭니다 var str = ""; 무작위 문자 연결하기
  • 루프 내에서 0에서 61 까지 rand 인덱스 번호만듭니다 (0..9 + A..Z + a..z = 62).
  • 올바른 CharCode 번호와 관련된 문자를 얻기 위해 몇 가지 숫자 (아래 예 참조)만큼 증가시키는 rand (0..61부터)를 조정 / 수정 하기위한 조건부 논리 를 작성하십시오.
  • 루프 내부에서 str 연결 String.fromCharCode( incremented rand )

Character 테이블 과 그 범위를 그림으로 그려 보겠습니다.

_____0....9______A..........Z______a..........z___________  Character
     | 10 |      |    26    |      |    26    |             Tot = 62 characters
    48....57    65..........90    97..........122           CharCode ranges

Math.floor( Math.random * 62 )0..61 (우리가 필요한 것)의 범위를 제공합니다. 올바른 charCode 범위 를 얻으려면 임의 값을 수정 (증가)하는 방법 무엇입니까?

      |   rand   | charCode |  (0..61)rand += fix            = charCode ranges |
------+----------+----------+--------------------------------+-----------------+
0..9  |   0..9   |  48..57  |  rand += 48                    =     48..57      |
A..Z  |  10..35  |  65..90  |  rand += 55 /*  90-35 = 55 */  =     65..90      |
a..z  |  36..61  |  97..122 |  rand += 61 /* 122-61 = 61 */  =     97..122     |

위 표의 조건부 연산 논리 :

   rand += rand>9 ? ( rand<36 ? 55 : 61 ) : 48 ;
// rand +=  true  ? (  true   ? 55 else 61 ) else 48 ;

위의 설명을 따랐 으면이 영숫자 스 니펫 을 만들 수 있어야합니다.

jsBin 데모

function randomString( len ) {
  var str = "";                                         // String result
  for(var i=0; i<len; i++){                             // Loop `len` times
    var rand = Math.floor( Math.random() * 62 );        // random: 0..61
    var charCode = rand+= rand>9? (rand<36?55:61) : 48; // Get correct charCode
    str += String.fromCharCode( charCode );             // add Character to str
  }
  return str;       // After all loops are done, return the concatenated string
}

console.log( randomString(10) ); // "7GL9F0ne6t"

또는 다음과 같은 경우 :

function randomString( n ) {
  var r="";
  while(n--)r+=String.fromCharCode((r=Math.random()*62|0,r+=r>9?(r<36?55:61):48));
  return r;
}

짧고, 쉽고, 신뢰할 수있다.

여기에서 발견 된 최상위 정답 중 일부와 반대로 정확히 5 개의 임의의 문자를 반환합니다.

Math.random().toString(36).substr(2, 5);

길이가 10자인 문자열을 생성하십시오. 길이는 매개 변수 (기본값 10)로 설정됩니다.

function random_string_generator(len) {
var len = len || 10;
var str = '';
var i = 0;

for(i=0; i<len; i++) {
    switch(Math.floor(Math.random()*3+1)) {
        case 1: // digit
            str += (Math.floor(Math.random()*9)).toString();
        break;

        case 2: // small letter
            str += String.fromCharCode(Math.floor(Math.random()*26) + 97); //'a'.charCodeAt(0));
        break;

        case 3: // big letter
            str += String.fromCharCode(Math.floor(Math.random()*26) + 65); //'A'.charCodeAt(0));
        break;

        default:
        break;
    }
}
return str;
}

나는 모두가 이미 그것을 가지고 있다는 것을 알고 있지만, 나는 가능한 한 가장 가벼운 방법 (코드가 아니라 CPU가 아닌)에서이 것을 사용하는 것 같았다.

function rand(length, current) {
  current = current ? current : '';
  return length ? rand(--length, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz".charAt(Math.floor(Math.random() * 60)) + current) : current;
}

console.log(rand(5));

당신의 머리를 감싸는 데는 약간의 시간이 걸리지 만, 정말 멋진 자바 스크립트 문법이 얼마나 멋진 지 알 것 같습니다.


내가 만든 방법은 다음과 같습니다.
대문자와 소문자가 모두 포함 된 문자열을 만듭니다.
또한 영숫자 문자열을 생성하는 함수도 포함 시켰습니다.

작업 예제 :
http://jsfiddle.net/greatbigmassive/vhsxs/ (알파에만 해당)
http://jsfiddle.net/greatbigmassive/PJwg8/ (영숫자)

function randString(x){
    var s = "";
    while(s.length<x&&x>0){
        var r = Math.random();
        s+= String.fromCharCode(Math.floor(r*26) + (r>0.5?97:65));
    }
    return s;
}

2015 년 7 월 업그레이드
이것은 똑같은 일을하지만보다 의미 있고 모든 글자를 포함합니다.

var s = "";
while(s.length<x&&x>0){
    v = Math.random()<0.5?32:0;
    s += String.fromCharCode(Math.round(Math.random()*((122-v)-(97-v))+(97-v)));
}

누구나 한 번에 하나의 라이너 (비록 사용자의 편의를 위해 포맷되지 않았지만)를 한꺼번에 할당하는 경우 (작은 문자열의 경우 실제로는 중요하지 않음) 여기에 어떻게해야하는지 알려줍니다.

Array.apply(0, Array(5)).map(function() {
    return (function(charset){
        return charset.charAt(Math.floor(Math.random() * charset.length))
    }('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'));
}).join('')

5 를 원하는 문자열의 길이로 대체 할 수 있습니다. @AriyaHidayat 덕분에 Array(5) 의해 생성 된 스파 스 어레이에서 작동하지 않는 map 기능에 대한 해결책을 찾았습니다.


소문자와 대문자를 모두 지원하는 깨끗한 솔루션을 찾지 못했습니다.

소문자 만 지원 :

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

소문자 및 대문자를 지원하는 해당 솔루션 구축 :

Math.random().toString(36).substr(2, 5).split('').map(c => Math.random() < 0.5 ? c.toUpperCase() : c).join('');

substr(2, 5) 를 필요한 길이로 조정하십시오.


어떻게 이런 식으로 : Date.now().toString(36) 당신이 그것을 호출 할 때마다 매우 짧지 만 매우 독특합니다.


여기에 doubletap의 훌륭한 대답이 있습니다. 원본에는 여기에 설명 된 두 가지 단점이 있습니다.

첫째, 다른 사람들이 언급했듯이 짧은 문자열 또는 빈 문자열 (임의의 숫자가 0 인 경우)을 생성 할 확률이 낮아 응용 프로그램을 손상시킬 수 있습니다. 해결책은 다음과 같습니다.

(Math.random().toString(36)+'00000000000000000').slice(2, N+2)

둘째, 위의 원본과 솔루션은 문자열 크기 N을 16 자로 제한합니다. 다음은 임의의 N에 대해 크기 N의 문자열을 반환합니다 (그러나 N> 16을 사용하면 임의성이 증가하지 않거나 충돌 확률이 감소하지 않습니다).

Array(N+1).join((Math.random().toString(36)+'00000000000000000').slice(2, 18)).slice(0, N)

설명:

  1. [0,1] 범위의 임의의 숫자, 즉 0 (포함)과 1 (제외) 사이의 임의의 숫자를 선택하십시오.
  2. 숫자를 기본 36 문자열로 변환하십시오 (예 : 0-9 및 az 문자 사용).
  3. 0이있는 패드 (첫 번째 문제 해결).
  4. 선두의 '0'을 잘라냅니다. 접두사 및 추가 패딩 0
  5. 적어도 N 개의 문자를 포함하도록 문자열을 충분히 반복하십시오 (빈 문자열을 단락 기호로 사용되는 짧은 임의 문자열과 결합하여).
  6. 문자열에서 정확히 N 문자를 잘라냅니다.

추가 생각 :

  • 이 솔루션은 대문자를 사용하지 않지만 거의 모든 경우 (의도적 인 말장난 없음) 중요하지 않습니다.
  • 원래 답변에서 N = 16의 최대 문자열 길이는 Chrome에서 측정됩니다. Firefox에서는 N = 11입니다. 그러나 설명했듯이 두 번째 솔루션은 임의성을 추가하는 것이 아니라 요청 된 문자열 길이를 지원하기 때문에 많은 차이를 만들지 않습니다.
  • 반환 된 모든 문자열은 적어도 Math.random ()이 반환 한 결과가 균등하게 분산 될 때까지 반환되는 동일한 확률을 갖습니다 (어떤 경우에도 암호화 강도 임의성이 아닙니다).
  • 크기 N의 가능한 모든 문자열이 반환 될 수있는 것은 아닙니다. 두번째 해법에서는 (더 작은 문자열이 단순히 복제되기 때문에) 명백하지만, 원래의 대답에서 이것은 base-36으로의 변환에서 마지막 몇 비트가 원래의 무작위 비트의 일부가 아니기 때문에 진실입니다. 특히 Math.random (). toString (36)의 결과를 보면 마지막 문자가 고르게 분포되지 않은 것을 알 수 있습니다. 다시 말하지만 거의 모든 경우에 중요하지 않지만 짧은 문자열 (예 : N = 1)이 영향을받지 않도록 임의 문자열의 끝보다는 처음부터 최종 문자열을 분할합니다.

최신 정보:

여기에 몇 가지 기능적 스타일의 단 하나의 라이너가 있습니다. 그들은 위의 해결책과 다릅니다.

  • 그들은 명시적인 임의의 알파벳을 사용합니다 (보다 일반적이며 대문자와 소문자를 모두 묻는 원래 질문에 적합합니다).
  • 길이가 N 인 모든 문자열은 동일한 확률로 반환됩니다 (즉 문자열에는 반복이 포함되지 않습니다).
  • 그것들은 toString (36) 트릭이 아닌 map 함수를 기반으로하므로보다 직관적이고 이해하기 쉽습니다.

그래서, 선택의 알파벳이

var s = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

이 두 가지는 서로 동일하므로 더 직관적 인 것을 선택할 수 있습니다.

Array(N).join().split(',').map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

Array.apply(null, Array(N)).map(function() { return s.charAt(Math.floor(Math.random() * s.length)); }).join('');

편집하다:

나는 qubyte 처럼 qubyte Martijn de Milliano 는 내가 어떻게 든 놓친 후자 (명성!)와 비슷한 솔루션을 생각해냅니다. 그들은 한눈에 짧은 것으로 보이지 않기 때문에, 누군가가 정말 한 - 라이너를 원할 경우를 대비하여 어쨌든 여기에 남겨 둘 것입니다 :-)

또한 모든 솔루션에서 '새 배열'을 '배열'로 대체하여 몇 바이트 더 줄였습니다.


여기에 하나의 쉬운 라이너가 있습니다. new Array(5) 를 변경하여 길이를 설정합니다.

0-9a-z 포함

new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36);})

0-9a-zA-Z

new Array(5).join().replace(/(.|$)/g, function(){return ((Math.random()*36)|0).toString(36)[Math.random()<.5?"toString":"toUpperCase"]();});

이 같은 것이 작동해야합니다.

function randomString(len, charSet) {
    charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    var randomString = '';
    for (var i = 0; i < len; i++) {
        var randomPoz = Math.floor(Math.random() * charSet.length);
        randomString += charSet.substring(randomPoz,randomPoz+1);
    }
    return randomString;
}

기본 문자셋 [a-zA-Z0-9]으로 전화하거나 직접 보내십시오.

var randomValue = randomString(5);

var randomValue = randomString(5, 'PICKCHARSFROMTHISSET');

이 콤팩트 트릭은 어때?

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var stringLength = 5;

function pickRandom() {
    return possible[Math.floor(Math.random() * possible.length)];
}

var randomString = Array.apply(null, Array(stringLength)).map(pickRandom).join('');

빈 배열을 속여서 정의되지 않은 배열로 속이려면 Array.apply 가 필요합니다.

ES2015를 코딩하는 경우 어레이를 빌드하는 것이 조금 더 간단합니다.

var randomString = Array.from({ length: stringLength }, pickRandom).join('');

임의의 DNA 시퀀스를 원한다면 항목 배열을 반복하고 문자열 변수에 반복적으로 추가 할 수 있습니다.

function randomDNA(len) {
  len = len || 100
  var nuc = new Array("A", "T", "C", "G")
  var i = 0
  var n = 0
  s = ''
  while (i <= len - 1) {
    n = Math.floor(Math.random() * 4)
    s += nuc[n]
    i++
  }
  return s
}

console.log(randomDNA(5));


Underscore 를 사용한다고 가정하면 단 두 줄만으로 임의의 문자열을 우아하게 생성 할 수 있습니다.

var possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var random = _.sample(possible, 5).join('');

coderain 을 사용할 수 있습니다. 주어진 패턴에 따라 임의의 코드를 생성하는 라이브러리입니다. 숫자뿐만 아니라 대소 문자의 자리 표시 자로 # 을 사용하십시오.

var cr = new CodeRain("#####");
console.log(cr.next());

대문자 A , 숫자에는 9 와 같은 다른 자리 표시자가 있습니다.

유용 할 수있는 것은 .next() 를 호출하면 항상 고유 한 결과를 얻을 수 있으므로 중복에 대해 걱정할 필요가 없다는 것입니다.

다음은 고유 한 임의 코드의 목록생성 하는 데모 응용 프로그램입니다.

전체 공개 : 저는 코더 라인 (coderain)의 저자입니다.


Lodash 또는 Underscore 사용하는 경우 다음과 같이 간단합니다.

var randomVal = _.sample('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', 5).join('');

es6 스프레드 연산자가 있는 최신 버전 :

[...Array(30)].map(() => Math.random().toString(36)[3]).join('')

  • 30 은 임의의 숫자이며 원하는 토큰 길이를 고를 수 있습니다.
  • 36numeric.toString() 전달할 수있는 최대 기수입니다. 즉 모든 숫자와 az 소문자 를 의미합니다.
  • 3 은 다음과 같은 임의의 문자열에서 세 번째 숫자를 선택하는 데 사용됩니다. "0.mfbiohx64i" , 0. 이후에 임의의 색인을 취할 수 있습니다 0.

수학. 랜덤 은 이런 종류의 일에 나쁘다.

옵션 1

서버 측에서이 작업을 수행 할 수 있다면 crypto 모듈 만 사용하십시오.

var crypto = require("crypto");
var id = crypto.randomBytes(20).toString('hex');

// "bb5dc8842ca31d4603d6aa11448d1654"

결과 문자열은 생성하는 임의의 바이트의 두 배가됩니다. 16 진수로 인코딩 된 각 바이트는 2 자입니다. 20 바이트는 16 진수 40 문자입니다.

옵션 2

클라이언트 쪽에서해야한다면 아마도 uuid 모듈을 사용해보십시오.

var uuid = require("uuid");
var id = uuid.v4();

// "110ec58a-a0f2-4ac4-8393-c866d813b8d1"

옵션 3

클라이언트 측을 사용해야하고 이전 브라우저를 지원할 필요가없는 경우 종속성없이 할 수 있습니다

// dec2hex :: Integer -> String
function dec2hex (dec) {
  return ('0' + dec.toString(16)).substr(-2)
}

// generateId :: Integer -> String
function generateId (len) {
  var arr = new Uint8Array((len || 40) / 2)
  window.crypto.getRandomValues(arr)
  return Array.from(arr, dec2hex).join('')
}

console.log(generateId())
// "82defcf324571e70b0521d79cce2bf3fffccd69"

console.log(generateId(20))
// "c1a050a4cd1556948d41"


let r = Math.random().toString(36).substring(7);
console.log("random", r);


Gertas와 Dragon이 제기 한 문제에 대답함으로써 Doubletap의 우아한 예를 확장합니다. 이러한 희귀 null 상황을 테스트하기 위해 while 루프를 추가하고 문자를 5로 제한하십시오.

function rndStr() {
    x=Math.random().toString(36).substring(7).substr(0,5);
    while (x.length!=5){
        x=Math.random().toString(36).substring(7).substr(0,5);
    }
    return x;
}

결과를 알려주는 jsfiddle가 있습니다 : http://jsfiddle.net/pLJJ7/





random