2013-03-28 3 views
3

У меня есть некоторый код для хранения случайного значения из массива в переменный, например так:Генерация случайного значения Javascript

Quest=["value1","value2","value3","value4"]; 
var random=Math.floor(Math.random() * Quest.length); 
var question = Quest[random]; 

я называю вторые и третьее строки коды несколько раз, так что то же самое значение получает генерируются более одного раза. У кого-нибудь есть идея для какого-то эффективного кода, чтобы гарантировать, что одно и то же значение не раз повторяется несколько раз по порядку?

+0

Вы имеете в виду, что ваше случайное число не должно быть сгенерировано следующим образом: 2,1,3,3,3,1,2, ... Те последующие 3-х должны быть когда-то там правы ... ?? –

+0

У вас есть четыре варианта, и вы не хотите, чтобы число повторялось (последовательно)? Как сдерживается ваше требование! – asgs

+0

Да, конечно. Но я хочу, чтобы это было предпочтительно - 2,1,3,4, ... или 1,3,4,2 ... и т. Д. – Ronophobia

ответ

2
  • Заполнение массива цифрами от 0 до (Quest.length-1).

  • Используйте this Код JavaScript для тасования этого массива.

Повторите:

  • В первый раз (т = 0), выходной массив [т].

  • Во второй раз (t = 1) выходной массив [t].

  • когда t% Quest.length (или array.length) == 0.

  • Снова перетасовать массив.

    и Повтор.

    function shuffle(o) 
        { 
        for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
         return o; 
        }; 
        Quest = ["value1", "value2", "value3", "value4"]; 
        var myarray = new Array(); 
        var i = 0; 
        for (i = 0; i < Quest.length; i++) { 
         myarray[i] = i; 
        } 
        shuffle(myarray); 
        for (i = 0; i < myarray.length; i++) { 
         document.write(myarray[i]); 
        } 
        for (i = 0; i < 50; i++) { 
         if (i % (Quest.length) == 0) { 
          shuffle(myarray); 
         } 
         document.write("<p>" + Quest[myarray[i % (Quest.length)]] + "</p>"); 
        } 
    
+1

Отлично, я постараюсь сделать это. Вернемся к вам с результатами. – Ronophobia

2

Вы можете сделать это с помощью splice метод:

var Quest = ["value1", "value2", "value3", "value4"]; 
var random1 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0]; 
... 
var random2 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0]; 
... 
var random3 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0]; 

Поскольку значение удаляется из Quest массива это гарантировано, что вопросы никогда не будет повторять

Demo: http://jsfiddle.net/dfsq/QUztw/3/

Примечание: если вы не хотите изменять исходный массив, который вы можете использовать с его копией Quest.slice().

+0

Ха-ха, сколько раз вы это редактировали? Это очень полезно, но не могли бы вы рассказать об этой заметке? – Ronophobia

+1

'splice' удаляет элементы из массива. Если вы не хотите этого поведения, вы должны использовать клонирование массива: 'var questClone = Quest.slice(); var random1 = questClone.splice (...) '. – dfsq

1

Другая возможность заключается в случайной сортировки массива:

function randomOrder() { 
return (Math.round(Math.random())-0.5); 
} 

var Quest = ["value1", "value2", "value3", "value4"]; 
Quest.sort(randomOrder); 

В этот момент вы можете пройти массив, и он не должен повторяться.

+0

На больших массивах это приведет к смещенному виду, потому что каждый элемент может быть перетасован более одного раза. –

2

Использование Fisher-Yates перетасовать массив:

var Quest=["value1","value2","value3","value4"]; 

function kfy(array) 
{ 
    for (var i = array.length - 1; i > 0; --i) { 
    var p = Math.floor(Math.random() * (i + 1)), 
    tmp = array[p]; 
    array[p] = array[i]; 
    array[i] = tmp; 
    } 
} 

console.log(Quest); 
kfy(Quest); 
console.log(Quest); 

Тогда просто итерацию с самого начала до конца вашего массива.

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