JS:数组改组,而不是字符串改组
JS: Array shuffling, not string shuffling
我正在尝试使用 JS 打乱字符串数组。我硬编码了三组字符。从每组中随机选择 3 个字符,然后连接起来。所以连接后的字符串是 3 个字母,后跟 3 个数字,再后跟 3 个符号。我想打乱这个串联的字符串,以便它们的顺序是随机的。
我已经检查过 How to randomize (shuffle) a JavaScript array?,我的算法和代码基本上与第二种解决方案相匹配,除了我在一个更大的函数中有洗牌循环(而不是作为它自己的函数)。也许我应该将洗牌添加到它自己的函数中并在更大的函数中调用它,但我认为这仍然会给我相同的结果。
函数的"shuffling part"实际上并不是洗牌。当我用 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;
}();
我不明白哪里出了问题。
你的shuffle有点乱,我看了this是用数组来shuffle的
// 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("");
当您执行赋值 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);
}
我正在尝试使用 JS 打乱字符串数组。我硬编码了三组字符。从每组中随机选择 3 个字符,然后连接起来。所以连接后的字符串是 3 个字母,后跟 3 个数字,再后跟 3 个符号。我想打乱这个串联的字符串,以便它们的顺序是随机的。
我已经检查过 How to randomize (shuffle) a JavaScript array?,我的算法和代码基本上与第二种解决方案相匹配,除了我在一个更大的函数中有洗牌循环(而不是作为它自己的函数)。也许我应该将洗牌添加到它自己的函数中并在更大的函数中调用它,但我认为这仍然会给我相同的结果。
函数的"shuffling part"实际上并不是洗牌。当我用 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;
}();
我不明白哪里出了问题。
你的shuffle有点乱,我看了this是用数组来shuffle的
// 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("");
当您执行赋值 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);
}