Предотвратить повторяющиеся случайные результаты в Javascript - PullRequest
0 голосов
/ 27 декабря 2011

На моем веб-сайте есть кнопка, которая выбирает случайную цитату из списка цитат и проецирует случайно выбранную цитату в текстовое поле.Это делается с помощью 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 ]

1 голос
/ 27 декабря 2011
  1. Заполните массив цитат, затем создайте копию.
  2. Зашифруйте копию массива (вы можете просто использовать метод .sort() или, что еще лучше, вы можете найти реализацию js Fisher-Yates alghoritm
  3. Вызов pop() над массивом при каждом событии щелчка, так что вы будете каждый раз генерировать разные кавычки, пока массив не будет полностью использован
  4. Когда длина массива равна нулю, переходите к 1)

Ссылка:

1 голос
/ 27 декабря 2011
<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

0 голосов
/ 27 декабря 2011

Вы можете настроить 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];
}
0 голосов
/ 27 декабря 2011

использование

var lastQuote=-1;

вне вашей функции, затем

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

внутри вашей функции

...