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

时间:2015-05-24 00:41:40

标签: javascript string random

我试图想办法用纯JS从一个数组中拉出一个随机字符串,而没有相同的字符串连续出现两次。

我使用随机数(random number)使用随机数索引从randomMsg中提取随机字符串,然后将其存储在{\ n}中{1}}。

点击后,我会用新的随机字符串重新定义currentMsg。我之后使用currentMsg / if语句来查看我们的else是否等于prevMsg,如果是的话(它不是'{1}}首先点击),我使用另一个currentMsg / if语句来递增或递减索引,因此它会向我们的HTML返回一个唯一的字符串(else)并设置{{ 1}} var到那个字符串。

否则,它会将anotherMsg返回给我们的HTML,并将prevMsg设置为currentMsg

下面的功能:

prevMsg

我还设置了JSFiddle here

虽然它有效,但我现在急于想要编写这样一个功能更优雅的方法。我还要更换整个字符串,更换一个字(一个,两个,三个等)或者不重要一点是不是更好?

感谢任何帮助。提前谢谢!

6 个答案:

答案 0 :(得分:2)

对于可读性通用的原因,数组应该 功能 >:

/

返回随机数 当前 随机数的函数:

var msg = [
    "string one",
    "string two",
    "string three",
    "string for",
    "string five",
    "string six" /* add as many values as you want */
];

Arr必须是函数的参数,因为需要数组的长度。还有一个返回随机数的函数:

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 randNumber(arr) {
    var rand = Math.floor(Math.random() * arr.length);
    return rand;
}

简单可读

Demo

答案 1 :(得分:1)

不是从数组中随机拉出一个字符串,而是将数组洗牌并按顺序拉出字符串。

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())));

答案 2 :(得分:0)

我取消了另一个Msg,一个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;       
};
})();

答案 3 :(得分:0)

在点击移动消息tmpMsg上添加了另一个tmpMsg,在下一次迭代时合并回randomMsg并将最新显示的消息移动到tmpMsg。

def date_of_next_X_day_Y_days_out_from_Z_start(day=ENV['day_to_start_plans'], number_of_days=ENV['min_days_out'], start_date)
  real_start_date = start_date + number_of_days     
  until real_start_date.wday == Date.parse(day).wday
    real_start_date += 1
  end  
  real_start_date
end

答案 4 :(得分:0)

以下代码非常简单,但可能会继续迭代很多,特别是如果消息数量很少的话。如果没有至少两条消息,则会出现无限循环。

getActivity()
var messages = ["string one", "string two", "string three", "string four", "string five"];
var i = -1,
    intro = document.getElementById("intro");
(intro.onclick = function() {
  while( i == (i = Math.floor((Math.random() * messages.length))) );
  intro.textContent = messages[i];
})();

为了避免这些问题,请更好地使用以下内容,即使它不那么简单:

<h1 id="intro"></h1>
var messages = ["string one", "string two", "string three", "string four", "string five"];
var i = Math.floor((Math.random() * messages.length)),
    intro = document.getElementById("intro");
(intro.onclick = function() {
  intro.textContent = messages[i];
  var rand = Math.floor((Math.random() * (messages.length-1)));
  i = rand + (rand >= i);
})();

答案 5 :(得分:0)

我更喜欢更具可读性的方法。

(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;
    }
})();