在JavaScript中从字符串中随机选择一个字母

4

这个问题与“从字符串中随机删除字母”的不同之处在于,我不想从字符串中删除任何内容。

我正在尝试使用 JavaScript 中的 Math.floor(Math.random()* string.length) 和 while 循环从字符串中选择一个随机字母。它需要不断向此字符串添加新的随机字母,直到达到指定长度。

我的代码如下:

var emptyString = "";
var alphabet = "abcdefghijklmnopqrstuvwxyz";
var getRandomLetter = alphabet[Math.floor(Math.random() * alphabet.length)];
var randomLetter = getRandomLetter;

while (emptyString.length < 6) {
emptyString += randomLetter;
emptyString ++;
} 
console.log(emptyString);

问题: 输出的是同一个字母6次:例如pppppp。
随机字母只从字符串中生成一次,然后重复直到指定长度。我需要它为每个字母生成随机输出:例如pwezjm。
我还注意到,如果我在字符串上进行第二个不同的while循环,它将生成与第一个循环相同的输出:例如pppppp。
我本以为它至少会生成一个与第一个循环不同的随机字母,但事实并非如此。为什么会这样?

这可能会对您有所帮助:https://dev59.com/9nI_5IYBdhLWcg3wK_s6#1497512 - nikoskip
1
您只生成了一个随机字母并且没有对其进行更改。它为什么需要改变呢? - Spencer Wieczorek
4个回答

11

因为你应该每次获取这封信,但你只需要做一次。

var emptyString = "";
var alphabet = "abcdefghijklmnopqrstuvwxyz";

while (emptyString.length < 6) {
  emptyString += alphabet[Math.floor(Math.random() * alphabet.length)];
} 
console.log(emptyString);

另外,我不确定您想通过emptyString++实现什么目的,因为++是“加一”的运算符,您不能对字符串进行加一操作。我认为其目的是将其用作while循环的计数器,但这是不必要的,因为计数器已经是字符串长度了。


1
如果这被用来生成密码,就不应该使用Math.random(),因为它不是加密安全的随机数生成器。相反,创建一个 new Uint32Array(6),使用 window.crypto.getRandomValues(uintArray) 填充随机值,然后使用这些数字从字母表中选取值。虽然稍微麻烦一些,但比起原来更加谨慎。 :) - Michael Cordingley

3

在一个循环中获取随机字符

在你的例子中,你只从数组中获取一次随机字符,因此没有办法在while循环中再次获取另一个随机字符。

还要注意,emptyString++会导致结果为NaN,因为你试图后置递增字符串

var emptyString = "";
var alphabet = "abcdefghijklmnopqrstuvwxyz";

while (emptyString.length < 6) {
  emptyString += alphabet[Math.floor(Math.random() * alphabet.length)];
}
console.log(emptyString);

另一个提示是,在while循环中,可以缓存alphabet.length而不是每次都查询它。

1
既然它只是复制了我的答案(不是故意的话),我认为没有必要保留它。 - nicael

2

虽然上面的代码不错,但我更喜欢简短的代码。

const randomLetter = ('abcdefghijklmnopqrstuvwxyz').split('')[(Math.floor(Math.random() * 26 ))];

0
你需要将getRandomLetter改为一个函数,并在循环内部重新赋值randomLetter,像这样:

var emptyString = "";
var alphabet = "abcdefghijklmnopqrstuvwxyz";
function getRandomLetter() {
  return alphabet[Math.floor(Math.random() * alphabet.length)];
}
var randomLetter;

while (emptyString.length < 6) {
  randomLetter = getRandomLetter();
  emptyString += randomLetter;
} 
console.log(emptyString);

你也不能对emptyString进行递增操作,因为它是一个字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接