Javascript JS:不重复相同字符串两次的随机字符串

Javascript JS:不重复相同字符串两次的随机字符串,javascript,string,random,Javascript,String,Random,我试图找到一种方法,从纯JS数组中提取一个随机字符串,而不让同一个字符串连续出现两次 我使用随机数(random number)使用随机数的索引从randomsg中提取随机字符串,然后将其存储在currentMsg中 单击后,我将用一个新的随机字符串重新定义currentMsg。然后,我使用一个if/else语句来查看我们的prevMsg是否等于currentMsg,如果它等于currentMsg,我使用另一个if/语句来增加或减少我们的索引,因此它返回一个唯一的字符串(anotherMsg)并

我试图找到一种方法,从纯JS数组中提取一个随机字符串,而不让同一个字符串连续出现两次

我使用随机数(
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。