【问题标题】:Generating a strings of random characters from an array and enabling repetition of randomly generated numbers从数组中生成一串随机字符并启用随机生成的数字的重复
【发布时间】:2016-12-11 22:52:32
【问题描述】:

大家晚上好,

我正在尝试生成一个由 8 个字符组成的字符串,这些字符是从数组中随机选择的。这就是我正在使用的:

var myArrayPismo = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 

while(myArrayPismo.length < 9){
    var randomletter = Math.ceil(Math.random()*myArrayPismo.length)
    if(myArrayPismo.indexOf(randomletter) > -1) continue;
    myArrayPismo[myArrayPismo.length] = randomletter;
}

出于某种原因,它只是打印出所有的字母。

这是我的数字生成函数:

var kodCisla = [];
while(kodCisla.length < 9){
    var randomnumber = Math.ceil(Math.random()*9)
    if(kodCisla.indexOf(randomnumber) > -1) continue;
    kodCisla[kodCisla.length] = randomnumber;
}

哪个工作正常。除了我希望它能够生成 2 个或更多相同的数字,而不仅仅是每次都不同。

我的目标是得到这样的随机字母串:KODlkSmQW 和一个随机的数字串,也可以像这样重复:887562327

我们将不胜感激任何对这些问题的帮助。

【问题讨论】:

  • 请举例说明您期望的输出。首先你说你想要随机,然后你说想要重复。另外,不要四舍五入,因为如果你四舍五入,你永远不会得到“A”。
  • 添加了预期结果
  • 我还没关注你。生成随机数时,总是存在重复值的可能性。
  • 试试这个jsfiddle.net/actf8rf0你可以附加额外的参数来满足你的需要(比如固定长度等)我把html只是为了演示。
  • 好吧,我设法解决了我的数字问题,我只需将 (kodCisla.indexOf(randomnumber) &gt; -1) 中的 -1 更改为 0

标签: javascript random


【解决方案1】:

可以从数组中提取随机元素的函数在这里很有用。注意使用Math.floor 而不是Math.ceil,以及在return 语句之前的数组访问。

function randomElement (array) {
    return array[Math.floor(Math.random() * array.length)]
}

var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''),
    result = '';
for (var i = 0; i < 8; i++) {
    result += randomElement(characters)
}
console.log(result) //=> (random 8-character string)
 

对于随机数,可以使用类似的randomInRange函数:

function randomInRange (a, b) {
    a |= 0
    b |= 0
    return Math.floor(Math.random() * (b - a + 1)) + a
}

var result = []
for (var i = 0; i < 8; i++) {
    result.push(randomInRange(0, 9))
}
console.log(result) //=> (eight random digits)

【讨论】:

  • 干杯,您可以将我的“解决方案”添加到数字生成问题中,您将获得完整的答案。
【解决方案2】:

您的第一个while 循环永远不会运行,因为它基于myArrayPismo.length &lt; 9 的条件,这已经是错误的,因为您只是将它设置为包含所有26 个字母。因此,当您稍后查看它时,您会得到所有原始值。你需要一个额外的数组来放入生成的随机数。

此外,在这种情况下,请远离while 循环,因为您确切知道要循环多少次,因此请改用常规的for 循环。

您的第二个数组(带有数字)执行此操作,并且肯定可以连续两次得出相同的随机数。

但是,两个数组都不需要在将随机数推入数组之前进行任何 if/then 检查。

最后,正如我所提到的,不要使用Math.ceil,因为你永远不会随机返回第一个元素,而是使用Math.floor

var myArrayPismo = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']; 

var resultArray = [];

for(var i = 0; i < 8; ++i){
  resultArray.push(myArrayPismo[Math.floor(Math.random()*myArrayPismo.length)]);
}

console.log(resultArray.join(""));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2014-02-09
    • 2018-01-25
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多