我正在做一个文字游戏,从字母表中随机抽取8个字母,玩家必须找到使用这些字母的单词.我必须找到一种方法,使挑选的字母始终包含3个元音和5个辅音.谢谢你的帮助

下面是我用来为游戏挑选随机字母的代码

function makeid(length) {
  var result           = '';
  var characters       = 'aaabcdeeefghiiijklmnooopqrstuuuvwxyz';
  var charactersLength = characters.length;
  for (var i = 0; i < length; i++) {
    let letter = characters.charAt(Math.floor(Math.random() * charactersLength));
    while (result.match(letter)) {
      letter = characters.charAt(Math.floor(Math.random() * charactersLength));
    }
    result += letter;
  }
  return result;
}

console.log("Id of 8 characters", makeid(8))

推荐答案

@拉尔斯的回答几乎是完美的,唯一的问题是,最后的字符串并没有真正被洗牌.

我建议你只需要创建两个数组:随机元音和随机辅音,然后将它们洗牌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())

没有重复的信件

你提到你不想要重复的信件;英语中的许多单词都有重复的字母.为什么这是一个要求?

你可以将vowelsconsonants洗牌,然后从该字符串中获得前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())

Javascript相关问答推荐

使用AJX发送表单后,$_Post看起来为空

vscode扩展-webView Panel按钮不起任何作用

Angular中计算信号和getter的区别

JQuery. show()工作,但. hide()不工作

如何从URL获取令牌?

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

如何在文本字段中输入变量?

ChartJs未呈现

IF语句的计算结果与实际情况相反

如何将zoom 变换应用到我的d3力有向图?

将数组扩展到对象中

回溯替代方式

更新Redux存储中的对象数组

当我点击一个按钮后按回车键时,如何阻止它再次被点击

JSON Web令牌(JWT)错误:RSA密钥对的签名无效

如何将值从后端传递到前端

调试jQuery代码以获取所有行的总和(票证类型)

响应,Use Callback更新状态变量,该变量也存在于其依赖数组中,它如何防止无限重新呈现?

我如何让我的弹力球在JavaScript和HTML画布中相互碰撞后改变 colored颜色 ?

如何将PNG图像放在wix站点的Open Streemap map 上,使PNG图像成为 map 不可分割的一部分?