JS:数组改组,而不是字符串改组

时间:2015-07-13 19:38:55

标签: javascript random shuffle

我正在尝试使用JS来改组字符串数组。我硬编码了三组字符。随机选择每组3个字符然后连接。因此,连接的字符串是3个字母,后跟3个数字,后跟3个符号。我想要将这个连接的字符串随机化,以便它们的顺序是随机的。

我已经检查了How to randomize (shuffle) a JavaScript array?,我的算法和代码基本上与第二个解决方案相匹配,除了我在一个更大的函数中有一个shuffle循环(而不是它自己的函数)。也许我应该将shuffling添加到它自己的函数中并在更大的函数中调用它,但我认为这仍然会给我相同的结果。

该功能的“混洗部分”实际上并非随机播放。当我使用console.log(temp)和console.log(tp [rnd])调试它时,显示正确的值。基本上,函数返回我想要改组的未洗过的字符串。

var letterSet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
var numberSet = "0123456789";
var symbolSet = "~!@#$%^&*()-_+=><";

this.generatePassword = function() {
        var rl = "";
        var rn = "";
        var rs = "";
        var tp = "";

        // 3 random letters
        for(var i = 0; i < 3; i++) {
            var rnd = Math.floor((Math.random() * 52));
            rl += letterSet[rnd];
        }

        // 3 random numbers
        for(var i = 0; i < 3; i++) {
            var rnd = Math.floor((Math.random() * 10));
            rn += numberSet[rnd];
        }

        // 3 random symbols
        for(var i = 0; i < 3; i++) {
            var rnd = Math.floor((Math.random() * 17));
            rs += symbolSet[rnd];
        }

        // String concatenation
        tp = rl + rn + rs;

        // Shuffling part
        for(var i = 0; i < tp.length; i++) {
            var rnd = Math.floor(Math.random() * tp.length);
            var temp = tp[i];
            tp[i] = tp[rnd];
            tp[rnd] = temp;
        }

        return tp;
    }();

我不明白出了什么问题。

2 个答案:

答案 0 :(得分:0)

你的洗牌有点过了,我看了this,它使用一个阵列来洗牌。

// String concatenation
tp = rl + rn + rs;
tp=tp.split('');

// Shuffling part
for(var i = 0; i < tp.length; i++) {
   var rnd = Math.floor(Math.random() * tp.length);
   var temp = tp[i];
   tp[i] = tp[rnd];
   tp[rnd] = temp;
}
tp=tp.join("");

答案 1 :(得分:0)

执行分配tp[i] = tp[rnd]tp[rnd] = temp时,它不会更改tp的值,因为字符串是不可变的。可以使用String上的方法操纵字符串并替换值。将这两个作业更改为以下内容:

for (var i = 0; i < tp.length; i++) {
    var rnd = Math.floor(Math.random() * tp.length);
    var temp = tp[i];
    tp = tp.replace(tp.substr(i, 1), tp[rnd]);
    tp = tp.replace(tp.substr(rnd, 1), temp);
}