将值随机拼接成数组
randomly splice values into array
我有一个乱码数组 "A",随机生成的 ASCII 字符...和一条消息 "M"。我想将消息 M 的字符插入到数组 A 中,这样 M 的字符的顺序是完整的......但随机分布在整个数组 A 中。
原始数组:zH$@%@$#@$@^^#@(%*$@^&@!$^%&
示例输出:zH$@%@^t$#@$@^^h#@(%*$@ ^&@i!$^%&s,等等...
var randomChars = [];
for(var i=33;i<127;++i) {
var letter = document.createElement('span');
letter.innerHTML = String.fromCharCode(i);
randomChars.push(letter);
}
var message = "this is a message";
var rand = 0;
for (var i = 0; i < message.split("").length; i++) {
rand = Math.floor((Math.random() * randomChars.length) + rand);
var letters = document.createElement('span');
letters.innerHTML = message.split("")[i];
letters.setAttribute("hidden","");
randomChars.splice(rand, 0, letters);
}
Fiddle: https://jsfiddle.net/0ftm2srz/1/
使用上一个随机索引作为下一个随机生成索引的最小值(不包含)。从零开始。
不过,您最终可能会得到一些勉强加扰的东西。 (!@#!$!@$#!@#this) 但它是随机的。
EDIT 更好的方法是生成 message.length
数量的唯一随机索引,将它们按升序排序,然后插入 message
中的字符在加扰数组中的那些点。
var o = {
array: "zH$@%@$#@$@^^#@(%*$@^&@!$^%&".split(''),
msg: "this is a message",
randomMsgIndex: function () { return Math.floor(Math.random() * this.msg.length); },
randomMsgChar: function () { return this.msg[this.randomMsgIndex()]; },
//resultingArray: [],
randomArrayIndex: function () { return Math.floor(Math.random() * this.array.length); }
}
for(var i = 0; i < o.msg.length; i++) {
o.array.splice(o.randomArrayIndex(), 0, o.randomMsgChar());
}
console.log(o.array);
我想出了这个 - 但我认为它仍然不是你想要的 - 你可能想要一些东西来跟踪已经添加了哪些消息字符 - 所以不要添加它们两次 - 并确保整个消息(所有字符)已添加到数组中。
版本 2 具有上述 功能:
var o = {
array: "zH$@%@$#@$@^^#@(%*$@^&@!$^%&".split(''),
msg: "this is a message",
msgArray: function () { this.msg.split(''); },
randomMsgIndex: function () { return Math.floor(Math.random() * this.msg.length); },
randomMsgChar: function (i) { return this.msg[i]; },
//resultingArray: [],
randomArrayIndex: function () { return Math.floor(Math.random() * this.array.length); },
stripStr: function (indexToSkip, originalStr) {
var result = "";
for (var i = 0; i < originalStr.length; i++)
if (indexToSkip != i)
result += originalStr[i];
return result;
}
}
for(var i = 0; i < o.msg.length; i++) {
var msgRandomIndex = o.randomMsgIndex();
o.array.splice(o.randomArrayIndex(), 0, o.randomMsgChar(msgRandomIndex));
o.msg = o.stripStr(msgRandomIndex, o.msg);
}
console.log(o.array);
我认为它仍然不是 100%,但正在朝着 "optimized" 解决方案迈进:-)
我有一个乱码数组 "A",随机生成的 ASCII 字符...和一条消息 "M"。我想将消息 M 的字符插入到数组 A 中,这样 M 的字符的顺序是完整的......但随机分布在整个数组 A 中。
原始数组:zH$@%@$#@$@^^#@(%*$@^&@!$^%&
示例输出:zH$@%@^t$#@$@^^h#@(%*$@ ^&@i!$^%&s,等等...
var randomChars = [];
for(var i=33;i<127;++i) {
var letter = document.createElement('span');
letter.innerHTML = String.fromCharCode(i);
randomChars.push(letter);
}
var message = "this is a message";
var rand = 0;
for (var i = 0; i < message.split("").length; i++) {
rand = Math.floor((Math.random() * randomChars.length) + rand);
var letters = document.createElement('span');
letters.innerHTML = message.split("")[i];
letters.setAttribute("hidden","");
randomChars.splice(rand, 0, letters);
}
Fiddle: https://jsfiddle.net/0ftm2srz/1/
使用上一个随机索引作为下一个随机生成索引的最小值(不包含)。从零开始。
不过,您最终可能会得到一些勉强加扰的东西。 (!@#!$!@$#!@#this) 但它是随机的。
EDIT 更好的方法是生成 message.length
数量的唯一随机索引,将它们按升序排序,然后插入 message
中的字符在加扰数组中的那些点。
var o = {
array: "zH$@%@$#@$@^^#@(%*$@^&@!$^%&".split(''),
msg: "this is a message",
randomMsgIndex: function () { return Math.floor(Math.random() * this.msg.length); },
randomMsgChar: function () { return this.msg[this.randomMsgIndex()]; },
//resultingArray: [],
randomArrayIndex: function () { return Math.floor(Math.random() * this.array.length); }
}
for(var i = 0; i < o.msg.length; i++) {
o.array.splice(o.randomArrayIndex(), 0, o.randomMsgChar());
}
console.log(o.array);
我想出了这个 - 但我认为它仍然不是你想要的 - 你可能想要一些东西来跟踪已经添加了哪些消息字符 - 所以不要添加它们两次 - 并确保整个消息(所有字符)已添加到数组中。
版本 2 具有上述 功能:
var o = {
array: "zH$@%@$#@$@^^#@(%*$@^&@!$^%&".split(''),
msg: "this is a message",
msgArray: function () { this.msg.split(''); },
randomMsgIndex: function () { return Math.floor(Math.random() * this.msg.length); },
randomMsgChar: function (i) { return this.msg[i]; },
//resultingArray: [],
randomArrayIndex: function () { return Math.floor(Math.random() * this.array.length); },
stripStr: function (indexToSkip, originalStr) {
var result = "";
for (var i = 0; i < originalStr.length; i++)
if (indexToSkip != i)
result += originalStr[i];
return result;
}
}
for(var i = 0; i < o.msg.length; i++) {
var msgRandomIndex = o.randomMsgIndex();
o.array.splice(o.randomArrayIndex(), 0, o.randomMsgChar(msgRandomIndex));
o.msg = o.stripStr(msgRandomIndex, o.msg);
}
console.log(o.array);
我认为它仍然不是 100%,但正在朝着 "optimized" 解决方案迈进:-)