0

在我的网站上,我有一个按钮,可以从引用列表中选择一个随机引用,并将随机选择的引用投射到一个文本框中。这是使用 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>

提前致谢; 我敢肯定,这对你们这些聪明人来说不会太难!

4

4 回答 4

1
  1. 填写一个引用数组,然后创建一个副本。
  2. 打乱数组的副本(您可以只使用.sort()方法,或者更好的是您可以寻找算法的 jsFisher-Yates实现
  3. 在每个点击事件上调用pop()数组,这样您每次都会生成不同的报价,直到数组被完全消耗
  4. 当数组长度为零时转到 1)

参考:

于 2011-12-27T14:45:36.000 回答
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

于 2011-12-27T14:48:12.523 回答
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];
}
于 2011-12-27T14:48:28.080 回答
0

利用

var lastQuote=-1;

在你的功能之外,然后

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

在你的函数里面

于 2011-12-27T14:38:22.833 回答