おそらく一意の識別子として使用するために、JavaScriptでランダムな英数字(大文字、小文字、および数字)の文字列を生成する(理にかなった)最短の方法は何ですか?
特定の文字だけを許可したい場合は、次のようにすることもできます。
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 += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\\';
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!'));
フィドル: 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);
}
本当に素敵でエレガントな解決策として私はこれに出会った。
Math.random().toString(36).slice(2)
この実装に関する注意事項
Math.random()
から来るため、出力は予測可能であり、したがって必ずしも一意ではありません。JAR.JAR.beansによって提案されている答えの別の変形
(Math.random()*1e32).toString(36)
乗数1e32
を変えることで、ランダムな文字列の長さを変えることができます。
あるいは、Jar Jarが提案したことを基にして、これは私が最近のプロジェクトで使用したものです(長さ制限を克服するため)。
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();
};
つかいます:
randomString(12, 16); // 12 hexadecimal characters
randomString(200); // 200 alphanumeric characters
ランダムな20文字(英数字の小文字)の場合は、lodash付きのワンライナー:
_.times(20, () => _.random(35).toString(36)).join('');
これはきれいです
Math.random().toString(36).substr(2, length)
例
Math.random().toString(36).substr(2, 5)
32文字の場合:
for(var c = ''; c.length < 32;) c += Math.random().toString(36).substr(2, 1)
私は以下が与えられた長さを可能にする最も簡単な解決策だと思います:
Array(myLength).fill(0).map(x => Math.random().toString(36).charAt(2)).join('')
それは矢印関数の構文に依存します。
ランダムな文字
String.fromCharCode(i); //where is an 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
function randomString(len) {
var p = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
return [...Array(len)].reduce(a=>a+p[~~(Math.random()*p.length)],'');
}
概要:
- 必要なサイズの配列を作成します(javascriptに同等の
range(len)
がないため)。- 配列の各要素に対して:
p
からランダムな文字を選び、それを文字列に追加する- 生成された文字列を返します。
いくつかの説明:
[...Array(len)]
Array(len)またはnew Array(len) 未定義のポインタを持つ配列を作成します 。ワンライナーは引っ張り出すのが難しくなるでしょう。 Spread syntax は便利にポインタを定義します(現在は未定義のオブジェクトを指しています!)。
.reduce(
Reduce 配列を、この場合は単一の文字列にします。 reduce機能はほとんどの言語で一般的です そして学ぶ価値があります。
a=>a+...
我々は 矢印機能 を使っています。
a
はアキュムレータです。この場合、終了時に返される最終結果の文字列です(これは文字列だからです)。 reduce関数の2番目の引数であるinitialValueは空の文字列です(''
)。つまり基本的に、配列の各要素を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のビット単位のNOT演算子です。 ~~
は短く、間違いなく速いこともあり、Math.floor(
と言うより楽しい方法です ここでいくつかの情報があります
Lodashを使う:
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>
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;
};
この質問を見たとき、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();
}
ランダムキージェネレーター
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"
この関数は任意の長さのランダムな文字列を返すべきです。
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
が返されることがあります。私のテストから私は30万文字の長さの文字列を取得することができました。
この関数は、文字列を2番目のパラメータとして関数に送信することで末尾再帰に変換できます。 JSがTail呼び出し最適化を使用しているかどうかわからない
わかりやすく単純で、特定の文字数に限定されません。
let len = 20, str = "";
while(str.length < len) str += Math.random().toString(36).substr(2);
str = str.substr(0, len);