2013-04-13 2 views
0

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

Немного часть кода. У меня 9 значений в моем массиве, и в начале все они пустые.

var gameCase = ['', '', '', '', '', '', '', '', '']; 
var randomValue = gameCase[VALUE_EMPTY*][Math.round(Math.random()*gameCase.length)]; 

* Вот часть, которую я действительно не знаю, как это сделать.

+0

Итак, вы хотите случайных чисел с не повторяется значения. Верный? Таким образом, массив, такой как ['', '', ''], может быть ['1', '2', '3'], но не ['1', '1', '2'] – SwimBikeRun

+0

У меня есть массив gameCase заполняется переменной. Каждый щелчок по элементу списка, массив получает другое значение. Поэтому мне нужно исключить этот новый ключ/значение, просто добавив в массив и создав новое случайное значение для добавления в этот массив. Странно объяснять. – jbr

ответ

3

Есть несколько способов подойти к этому:

Метод 1: Keep генерации случайного индекса до тех пор, пока не указует на пустое значение

var gameCase = ['', '', '', '', '', '', '', '', '']; 
var randomIndex = Math.round(Math.random()*gameCase.length) % emptyCases.length; 
var randomValue = gameCase[randomIndex]; 
// while we haven't found the empty value 
while (randomValue !== '') { 
    // keep on looking 
    randomIndex = Math.round(Math.random()*gameCase.length % emptyCases.length); 
    randomValue = gameCase[randomIndex]; 
} 
// when we exit the while loop: 
//  - randomValue would === '' 
//  - randomIndex would point to its position in gameCase[] 

Метод 2: Есть 2-й массив, который держит трек которых индексы из массива gameCase имеют пустые значения

var gameCase = ['', '', '', '', '', '', '', '', '']; 
var emptyCases = [0,1,2,3,4,5,6,7,8]; 

if (emptyCases.length > 0) { 
    // generate random Index from emptyCases[] 
    var randomIndex = emptyCase[Math.round(Math.random()*emptyCase.length) % emptyCases.length]; 
    // get the corresponding value 
    var randomValue = gameCase[randomIndex]; 
    // remove index from emptyCases[] 
    emptyCases.splice(randomIndex, 1); 
} 

Метод № 2 более эффективен в некотором смысле, потому что у вас нет времени для создания/угадывания случайного индекса. Для метода № 1 вам нужен способ проверить , если в gameCase[] есть пустые значения, иначе вы можете генерировать/угадывать навсегда в бесконечном цикле.

Подробнее: При установке значения gameCase[] вам необходимо обновить emptyCases[] соответствующим образом, чтобы точно отражать состояние gameCase[]:

var gameCase = ['', '', '', '', '', '', '', '', '']; 
var emptyCases = [0,1,2,3,4,5,6,7,8]; 

/* Update a value in gameCase[] at the specified index */ 
var setGameCaseValue = function(index, value) { 
    // set value for gameCase[] 
    gameCase[index] = value; 

    if (value !== '') { // we're setting a value 
     // remove that index from emptyCases[] 
     emptyCases.splice(emptyCases.indexOf(index), 1); 
    } else { // we're setting it back to empty string 
     // add that index into emptyCases[] that refers to the empty string in gameCase[] 
     emptyCases.push(index);   
    } 
}; 

setGameCaseValue(2, 'null'); 
// gameCase now has ['','','null','','','','','',''] 
// emptyCases now has [0,1,3,4,5,6,7,8] 

setGameCaseValue(0, 'null'); 
// gameCase now has ['null','','null','','','','','',''] 
// emptyCases now has [1,3,4,5,6,7,8] 

setGameCaseValue(5, 'null'); 
// gameCase now has ['null','','null','','','null','','',''] 
// emptyCases now has [1,3,4,6,7,8] 

setGameCaseValue(7, 'null'); 
// gameCase now has ['null','','null','','','null','','null',''] 
// emptyCases now has [1,3,4,6,8] 

См скрипку: http://jsfiddle.net/rWvnW/1/

+0

Очень хороший ответ. Приятно, чтобы вы нашли время, чтобы объяснить решения, их относительные достоинства и почему один лучше, чем другой. Получил мой голос! –

+0

Я думаю, что вы забыли одно слово «s» для слов emptyCase (s) в методе 2. В противном случае я попытался использовать два метода, но я действительно не собираюсь их интегрировать. Когда я сделал console.log() из randomeValue, ничего не появляется. – jbr

+0

Я думаю, что что-то пошло не так. Когда я попытался добавить какое-то значение в свой массив gameCase, emptyCases не изменяется. Http://jsfiddle.net/rWvnW – jbr

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