2011-12-27 2 views
0

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

Спасибо заранее; Я уверен, что это не будет слишком тяжело для вас, браниаков!

+1

способ сделать это * перетасовывать * список котировок определенным стабильным способом, а не просто выбирать случайный элемент. – Pointy

ответ

0

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

var lastQuote=-1; 

за пределами функции, то

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

внутри функции

+0

будет работать хорошо, чтобы избежать прямого последующего вызова, но не будет делать дополнительные 3 других элемента click. – malko

1
  1. Заполнить массив цитаты, а затем создать копию.
  2. Scramble копию массива (вы можете просто использовать .sort() метод или даже лучше, вы можете посмотреть на реализацию Js из Fisher-Yates alghoritm
  3. вызовов pop() по массиву на каждом событии мыши, так что вы будете генерировать каждый раз другую цитату пока массив не будет полностью потребляются
  4. Когда длина массива равна нулю Гото 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

+0

Мне нравится этот, потому что случайный не выполняется при каждом вызове, но это также плохая часть, это менее случайный случай, когда shuffle вызывается только тогда, когда все кавычки уже заданы один раз. В зависимости от реальных потребностей, но этот для меня приятный :) – malko

+0

@malko да есть шанс, что цитата появится снова сразу после, но только после полного цикла. Не знаю, если это достаточно хорошо. – Esailija

+0

Я уверен, что это;) – malko

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]; 
} 
+0

Спасибо за этот ответ, я внедрил ваш, поскольку я пока не могу получить работу Esailija. Кажется, что это работает отлично, поэтому я буду отмечать этот ответ, если я все еще не смогу выполнить Esailija. – Galeforce

Смежные вопросы