2012-05-10 4 views
0

Мне нужно создать случайное число в диапазоне от 2 до 5, которое будет отличаться каждый раз. Например, я не хочу, чтобы два 3 в строке, или два 5 в ряд. Затем я должен подать это в цикл for(), например:Произвольное случайное число, которое различно каждый раз

for(var i = 0; i < noBoxes.length; i+=randNumber) { 
    //.... 
} 

Как мне это сделать?

+6

«Я не хочу, два 3-х подряд , или два 5 в ряд ». - тогда это не было бы случайным :) – jbabey

+0

Так что вы хотите получить случайное число из списка номеров и удалить этот номер из списка после его появления? – andlrc

+0

jbabey: Это не будет равномерно распределенное, некоррелированное случайное число, но оно все еще стохастично. –

ответ

2

Генерирует случайное число до п-1 и добавить его, по модулю исходный диапазон (сдвиг, поскольку мин не 0):

i = some random int from 2 to 5 
delta = randInt(3) // range of possible values from 2 to 5 is 4, minus 1 to 
        // prevent getting all the way round to i again 
nextval = (i-2+delta)%4+2 // shift i down by the minimum, add the 
          // delta and modulo the range 

Это работает, потому что он добавляет до 1 ниже диапазона , поэтому он никогда не сможет вернуться к исходному номеру. Например, i = 3, случайный int 0 до 2, поэтому max равен (i-2 + 2)% 3 + 2 = 3% 3 + 2 = 0 + 2 = 2.

function differentRandInt(min,max,current) { 
    var shiftedcurrent = current-min; 
    var range = max-min+1; 
    var delta = Math.floor((Math.random()*(range-1))+1); 
    return (shiftedcurrent + delta)%range + min; 
} 

Так что, если я = 3, то я-мин равен 1, диапазон после добавления дельты является 2,3,4, по модулю 4 с получением 2,3,0, так что добавление минимальный дают нам 4, 5,2.

+0

Как это избежать, чего пытается избежать ОП? –

+0

Он добавляет к дельте, которая ограничена ниже диапазона (от 2 до 5). Фактически он уменьшает диапазон чисел до всех, кроме текущего значения, без необходимости повторного генерации значения, если он сталкивается. –

+0

Я думаю, что в вашем коде есть небольшая ошибка, в настоящее время она не будет обрабатывать верхнюю границу. – Yoshi

2

Edit: более полное решение, и фиксируется ошибка на единицу:

var prev, randNumber; 
for(var i = 0; i < noBoxes.length; i+=randNumber) { 
    do { 
     randNumber = 2 + Math.floor(Math.random() * 4); 
    } while(randNumber === prev); 
    prev = randNumber; 
} 
+0

Не работал для меня. Получил обман нескольких раз. – j08691

+0

Это, скорее всего, приводит к одинаковым числам в строке во множестве точек. – Amberlamps

+0

Я просто обновил его, чтобы получить более полное решение. – jmar777

0

Как так: http://jsbin.com/eyitav/

var loopingValues = [2, 3, 4, 5], 
    len, 
    value, 
    rand; 

while ((len=loopingValues.length)) { 
    rand = ~~((Math.random() % 1) * len); 
    value = loopingValues.splice(rand, 1)[0]; 
    //alert(value) 
} 

Теперь у вас есть цикл с value в качестве значения 2, 3, 4 and 5 в случайной заказ.


Или легче читать: http://jsbin.com/ejizuw/

var loopingValues = [2, 3, 4, 5], 
    value, 
    rand; 

while (loopingValues.length) { 
    rand = Math.random(); 
    if (rand === 1) { 
    rand = 0; 
    } 
    rand = rand * loopingValues.length; 
    rand = Math.floor(rand); 

    value = loopingValues[rand]; 

    loopingValues.splice(rand, 1); 

    alert(value); 
} 
0

Вы можете получить серию в массиве, прежде чем начать looping-

var noBoxes={length:100}; 
var R= [2], r= 2, n= 2; 
while(R.length<noBoxes.length){ 
    n= R[R.length-1]; 
    while(r== n) r= 2+Math.floor(Math.random()*4) 
    R.push(r); 
} 


And then loop through the array- 

for(var i = 0; i < noBoxes.length; i+=R[i]) { 
    .... 
} 
Смежные вопросы