Javascript JS:不重复相同字符串两次的随机字符串
我试图找到一种方法,从纯JS数组中提取一个随机字符串,而不让同一个字符串连续出现两次 我使用随机数(Javascript JS:不重复相同字符串两次的随机字符串,javascript,string,random,Javascript,String,Random,我试图找到一种方法,从纯JS数组中提取一个随机字符串,而不让同一个字符串连续出现两次 我使用随机数(random number)使用随机数的索引从randomsg中提取随机字符串,然后将其存储在currentMsg中 单击后,我将用一个新的随机字符串重新定义currentMsg。然后,我使用一个if/else语句来查看我们的prevMsg是否等于currentMsg,如果它等于currentMsg,我使用另一个if/语句来增加或减少我们的索引,因此它返回一个唯一的字符串(anotherMsg)并
random number
)使用随机数的索引从randomsg
中提取随机字符串,然后将其存储在currentMsg
中
单击后,我将用一个新的随机字符串重新定义currentMsg
。然后,我使用一个if
/else
语句来查看我们的prevMsg
是否等于currentMsg
,如果它等于currentMsg
,我使用另一个if
/语句来增加或减少我们的索引,因此它返回一个唯一的字符串(anotherMsg
)并将prevMsg
var设置为该字符串
否则,它将currentMsg
返回到我们的HTML,并将prevMsg
设置为等于currentMsg
功能如下:
(function message() {
var ranNumber = Math.floor((Math.random() * 5) + 0);
var randomMsg = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
var currentMsg = randomMsg[Math.floor((Math.random() * 5) + 0)];
var prevMsg = "";
document.getElementById("intro").innerHTML = currentMsg;
document.getElementById("intro").onclick = function() {
var ranNum = Math.floor((Math.random() * 5) + 0);
currentMsg = randomMsg[ranNum];
if(prevMsg == currentMsg) {
var anotherMsg = "";
if(ranNum >= 0 && ranNum < 4) {
anotherMsg = randomMsg[ranNum + 1];
}
else {
anotherMsg = randomMsg[ranNum - 1];
}
document.getElementById("intro").innerHTML = anotherMsg;
prevMsg = anotherMsg; // set prevMsg to anotherMsg
} else {
document.getElementById("intro").innerHTML = currentMsg;
prevMsg = currentMsg; // set prevMsg to currentMsg
};
};
})();
(功能消息(){
var ranNumber=Math.floor((Math.random()*5)+0);
var randomMsg=[
“一串”,
“第二串”,
“第三串”,
“第四串”,
“第五串”
];
var currentMsg=randomsg[Math.floor((Math.random()*5)+0)];
var prevMsg=“”;
document.getElementById(“intro”).innerHTML=currentMsg;
document.getElementById(“intro”).onclick=function(){
var ranNum=Math.floor((Math.random()*5)+0);
currentMsg=randomMsg[ranNum];
如果(prevMsg==currentMsg){
var anotherMsg=“”;
如果(ranNum>=0&&ranNum<4){
anotherMsg=randomMsg[ranNum+1];
}
否则{
anotherMsg=randomMsg[ranNum-1];
}
document.getElementById(“intro”).innerHTML=anotherMsg;
prevMsg=anotherMsg;//将prevMsg设置为anotherMsg
}否则{
document.getElementById(“intro”).innerHTML=currentMsg;
prevMsg=currentMsg;//将prevMsg设置为currentMsg
};
};
})();
我还设置了一个
虽然它可以工作,但我现在很想知道是否有更优雅的方法来编写这样的函数。另外,我要替换整个字符串,是只替换单词(一、二、三等)更好,还是一点都不重要
感谢您的帮助。提前谢谢 我去掉了anotherMsg,一个if子句,并使用了三元运算符:
(function message() {
var currentMsg, prevMsg;
var ranNumber = Math.floor((Math.random() * 5) + 0);
var randomMsg = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
prevMsg = (prevMsg) ? prevMsg : "";
var currentMsg = randomMsg[ranNumber];
document.getElementById("intro").innerHTML = currentMsg;
document.getElementById("intro").onclick = function() {
var ranNum = Math.floor((Math.random() * 5) + 0);
currentMsg = randomMsg[ranNum];
if(prevMsg === currentMsg) {
ranNum = (ranNum === 4) ? 0 : ranNum++;
currentMsg = randomMsg[ranNumber];
}
document.getElementById("intro").innerHTML = currentMsg;
prevMsg = currentMsg;
};
})();
添加了另一个tmpMsg,单击将消息移动到tmpMsg,在下一次迭代中合并回randomMsg,并将最新显示的消息移动到tmpMsg
(function message() {
var randomMsg = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
var random = function() {
return Math.floor((Math.random() * (randomMsg.length)) + 0);
}
var tmpMsg;
var ranNumber = random();
var currentMsg = randomMsg[ranNumber];
tmpMsg = randomMsg.splice(ranNumber, 1)[0];
document.getElementById("intro").innerHTML = currentMsg;
document.getElementById("intro").onclick = function() {
ranNumber = random();
currentMsg = randomMsg[ranNumber];
document.getElementById("intro").innerHTML = currentMsg;
randomMsg.push(tmpMsg);
tmpMsg = randomMsg.splice(ranNumber, 1)[0];
if (randomMsg.length === 0) {
randomMsg = tmpMsg;
tmpMsg = [];
}
};
})();
下面的代码非常简单,但可能会重复很多次,特别是在消息数量较少的情况下。如果没有至少两条消息,那么将有一个无限循环
var messages=[“字符串一”、“字符串二”、“字符串三”、“字符串四”、“字符串五”];
变量i=-1,
intro=document.getElementById(“intro”);
(intro.onclick=function(){
而(i==(i=Math.floor((Math.random()*messages.length));
intro.textContent=消息[i];
})();代码>
我更喜欢可读性更强的方法
(function message() {
var introElem = document.getElementById("intro");
var randomMessages = [
"string one",
"string two",
"string three",
"string four",
"string five"
];
var randomMessagesLength = randomMessages.length;
introElem.innerHTML = getRandomMessage(introElem);
introElem.onclick = function() {
introElem.innerHTML = getRandomMessage(introElem);
};
function getRandomMessage(elem) {
var isNewRandMessage = false;
var randMessage = "";
do {
randNumber = Math.floor(Math.random() * randomMessagesLength);
randMessage = randomMessages[randNumber];
if (elem.innerHTML != randMessage) {
isNewRandMessage = true;
}
} while (!isNewRandMessage);
return randMessage;
}
})();
不要从数组中随机抽取字符串,而是洗牌数组并按顺序拉出字符串
randomMsg.sort(function(){return Math.random()-0.5}); // shuffle
如果要保持randomMsg
的原始顺序,只需.slice()
将其放入另一个数组中:
var shuffedMsg = randomMsg.slice().sort(function(){return Math.random()-0.5});
就像洗牌一副牌一样,你可以洗牌不止一次来混合更多的牌。但是像上面的例子那样调用.sort()
会变得很乏味。因此,将其包装在函数中:
function shuffle (arr) {
return arr..sort(function(){return Math.random()-0.5});
}
var shuffledMsg = shuffle(shuffle(shuffle(randomMsg.slice())));
(function message() {
var intro = document.getElementById("intro");
var currNumber = randNumber(msg);
intro.innerHTML = msg[currNumber];
var clickNumber = randWithout(currNumber, msg);
intro.onclick = function () {
intro.innerHTML = msg[clickNumber];
clickNumber = randWithout(clickNumber, msg);
}
})()
由于可读性和通用性原因,数组应位于函数之外:
var msg = [
"string one",
"string two",
"string three",
"string for",
"string five",
"string six" /* add as many values as you want */
];
function randWithout(n, arr) {
var res = [];
for (var i = 0; i < arr.length; i += 1) {
if (i !== n) {
res.push(i);
}
}
return res[Math.floor(Math.random() * (arr.length - 1))];
}
一种函数,返回一个随机数,但不返回当前的随机数:
var msg = [
"string one",
"string two",
"string three",
"string for",
"string five",
"string six" /* add as many values as you want */
];
function randWithout(n, arr) {
var res = [];
for (var i = 0; i < arr.length; i += 1) {
if (i !== n) {
res.push(i);
}
}
return res[Math.floor(Math.random() * (arr.length - 1))];
}
最后一个功能:
function shuffle (arr) {
return arr..sort(function(){return Math.random()-0.5});
}
var shuffledMsg = shuffle(shuffle(shuffle(randomMsg.slice())));
(function message() {
var intro = document.getElementById("intro");
var currNumber = randNumber(msg);
intro.innerHTML = msg[currNumber];
var clickNumber = randWithout(currNumber, msg);
intro.onclick = function () {
intro.innerHTML = msg[clickNumber];
clickNumber = randWithout(clickNumber, msg);
}
})()
普通和可读
因为“它有效”,而您的问题是供审查的,我建议您在以后再问这个问题,而不是在这里。谢谢您。很容易理解。我无法计算出返回的res[Math.floor(Math.random()*(arr.length-1))
正在执行–您能解释一下吗?在函数randWithout
中,您将数组中的所有索引(此处为msg)推入结果数组,但当前数字中的索引除外。长度为arr.length-1
。这里,msg数组的长度为6,结果数组的长度必须为5。例如res=[0,1,3,4,5]
。现在这里的数字是2。我们不想马上把这个作为电话号码Math.floor(Math.random()*5)
0,1,2,3,4中的随机数res[Math.floor(Math.random()*(arr.length-1))]
例如res[3]
来自[0,1,3,4,5]4。