防止随后的随机结果在Javascript中重复

时间:2011-12-27 14:32:52

标签: javascript random quote

在我的网站上,我有一个按钮,可以从引号列表中选择一个随机引用,并将随机选择的引号投影到文本框中。这是使用JavaScript完成的。​​

虽然我有这个工作,但我想要一个额外的代码,以防止直接后续引用与前一个相同。我想任何引用都可以再次出现,但不是直接跟随。

如果可能的话,我也会喜欢它,所以任何使用的引用都不会再出现至少3次点击 - 但这只是一个奖励。

无论如何,我目前的代码如下:

<head>    
  <script language="javascript"><!--
    function GenerateQuote(){var aquote=new Array;
      aquote[0]="\"Quote0\"";
      aquote[1]="\"Quote1\"";
      aquote[2]="\"Quote2\""
      aquote[3]="\"Quote3\"";
      aquote[4]="\"Quote4\"";
      aquote[5]="\"Quote5\"";
      aquote[6]="\"Quote6\"";
    rdmQuote=Math.floor(Math.random()*aquote.length);
    document.getElementById("quoteBox").value=aquote[rdmQuote];
    }
  -->
  </script>
</head>

<body>
  <textarea id="quoteBox" readonly></textarea>
  <button onClick="GenerateQuote()">Entertainment & Hobbies</button>
</body>

提前致谢;我相信你对brainiacs来说不会太难!

4 个答案:

答案 0 :(得分:1)

  1. 填写引号数组,然后创建副本。
  2. 加扰数组的副本(您可以使用.sort()方法,甚至可以更好地查找Fisher-Yates alghoritm
  3. 的js实现
  4. 在每个点击事件上调用数组pop(),这样每次都会生成不同的引号,直到数组完全耗尽
  5. 当数组的长度为零时,转到1)
  6. 参考:

答案 1 :(得分:1)

<head>
    <script type="text/javascript">
!function (){
    var quotes = ["quote0", "quote1", "quote2", "quote3", "quote4", "quote5", "quote6", "quote7", "quote8"],
        shuffleAfter = quotes.length, cur = 0;


    function shuffle( arr ) {
        var l = arr.length, j, i, tmp;

        for( i = l - 1; i > 0; --i ) {
            j = ( Math.random() * ( i + 1 ) ) >>> 0;
            tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }

        return arr;
    }

    function generateQuote(){
        var r;

        if( cur++ % shuffleAfter === 0 ) {
            shuffle(quotes);
        }

        r = quotes.shift();

        quotes.push( r );

        return r;
    }


    window.generateQuote = generateQuote;
}()
    </script>
</head>
<body>
    <textarea id="quoteBox" readonly></textarea>
    <button onClick="document.getElementById('quoteBox').value = generateQuote()">Entertainment & Hobbies</button>
</body>

调用generateQuote()27次的结果:

2,9,7,5,8,1,3,4,6,9,6,1,7,5,4,3,2,8,3,1,6,5,2,7,9,4,8,2

正如您所看到的,在一个完整周期之后,报价再次被洗牌,如果它在最后一个周期中是最后一个并且在新周期中是第一个,则有可能出现相同的报价。它应该比我的mp3播放器中的播放列表改组要好得多:P

答案 2 :(得分:0)

使用

var lastQuote=-1;

在你的职能之外,然后

var rdmQuote=lastQuote;
while (rdmQuote==lastQUote) rdmQuote=Math.floor(Math.random()*aquote.length);
lastQuote=rdmQuote;

你的职能

答案 3 :(得分:0)

你可以调整dontRepeatUntil来满足你的需求 肯定有更好的方法,但这个应该有效

var latestQuote = []
    , dontRepeatUntil=3
    , rdmQuote = null
    , quotes=[
        "\"Quote0\""
        ,"\"Quote2\""
        ,"\"Quote3\""
        ,"\"Quote4\""
        ,"\"Quote5\""
        ,"\"Quote6\""
    ]
;
function GenerateQuote(){
if(latestQuote.length >= dontRepeatUntil){
    latestQuote = latestQuote.slice(latestQuote.length-dontRepeatUntil+1);
}
    do{
        rdmQuote=Math.floor(Math.random()*quotes.length);
    }while(latestQuote.join(',').match(new RegExp('(^|,)'+rdmQuote+'(,|$)')));
    latestQuote.push(rdmQuote);
    document.getElementById("quoteBox").value=quotes[rdmQuote];
}