@拉尔斯的回答几乎是完美的,唯一的问题是,最后的字符串并没有真正被洗牌.
我建议你只需要创建两个数组:随机元音和随机辅音,然后将它们洗牌using Fisher-Yates' algorithm次.
function getRandomCharsFromString(str, length) {
return Array.from({length}, () => {
return str[Math.floor(Math.random() * str.length)]
});
}
function shuffle(str) {
var a = str.split(""),
n = a.length;
for (var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
// Swap them with ES6 destructuring magic
[a[i], a[j]] = [a[j], a[i]];
}
return a.join("");
}
function getRandomString() {
const vowels = 'aeiou';
const consonants = 'bcdfghjklmnpqrstvwxyz';
const randomVowels = getRandomCharsFromString(vowels, 3);
const randomConsonants = getRandomCharsFromString(consonants, 5);
const randomWord = [...randomVowels, ...randomConsonants].join('')
return shuffle(randomWord)
}
console.log('random string:', getRandomString())
没有重复的信件
你提到你不想要重复的信件;英语中的许多单词都有重复的字母.为什么这是一个要求?
你可以将vowels
和consonants
洗牌,然后从该字符串中获得前x
个字符.
// This version makes sure characters are not repeated
function getRandomCharsFromString(str, length) {
return shuffle(str).slice(0, length);
}
function shuffle(str) {
var a = str.split(''),
n = a.length;
for (var i = n - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
// Swap them with ES6 destructuring magic
[a[i], a[j]] = [a[j], a[i]];
}
return a;
}
function getRandomString() {
const vowels = 'aeiou';
const consonants = 'bcdfghjklmnpqrstvwxyz';
const randomVowels = getRandomCharsFromString(vowels, 3);
const randomConsonants = getRandomCharsFromString(consonants, 5);
const randomWord = [...randomVowels, ...randomConsonants].join('')
return shuffle(randomWord).join('')
}
console.log('random string:', getRandomString())