Саморегулирующийся случайный список - PullRequest
3 голосов
/ 06 января 2012

У меня есть сетка из 9 столбцов по 3 строки (поэтому каждый столбец имеет 3 слота).Минимум один слот в каждом столбце должен быть отмечен, и не более 3 могут быть отмечены.Метка представлена ​​цифрой 1,2 или 3.

Всего всегда должно быть 15 отмеченных слотов.Чтобы добиться этого, я попробовал следующее:

var valueLeft = 15;
while (valueLeft > 0)
{
    var ranValue = utils.getRandomInt(1,3);
    console.log('slots remaining: ' + (valueLeft - ranValue));
    if (ranValue >= valueLeft)
    {
            ranValue = valueLeft;
    }
    valueList.push(ranValue);
    valueLeft -= ranValue;
}
console.log(valueList);

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

Например, что я мог быв конечном итоге это: [2, 1, 1, 1, 1, 2, 3, 1, 2, 1]

Когда мне, например, нужно: [2, 2, 1, 1, 1, 1, 3, 2, 2] или [2, 2, 1, 2, 1, 1, 3, 2, 1]

и т. Д.

Любой совет приветствуется.Не стесняйтесь разжигать меня из-за моего слабого чувства логики :)

Ответы [ 3 ]

3 голосов
/ 06 января 2012

Этот ответ демонстрирует сходный подход ко многим из уже опубликованных, но я чувствую, что они делают его слишком сложным. Это может быть очень просто:

function pad(list, size) {
    var total = list.length;
    while (total != size) {
        var i = utils.getRandomInt(0, 8);
        if (list[i] < 3) {
            list[i]++;
            total++;
        }
    }
    return list;
}

var valueList = pad(new Array(1,1,1,1,1,1,1,1,1), 15);

Вам не нужно много дел. Точно так же, как многие другие уже сказали, инициализировать массив с 1. Затем просто добавьте один к случайным элементам (значение которых не равно 3), пока общее число не станет 15.

3 голосов
/ 06 января 2012

почему бы вам не сделать это:

начать с массива, который выглядит следующим образом: 1,1,1,1,1,1,1,1,1

затем создайте функцию, которая выбирает случайное число от 0 до 8 6 раз.

, если одно и то же число было выбрано более двух раз, пропустите его и выберите новое

, затем сопоставьте эти 6числа к индексу массива и добавляйте 1 для каждого выбора этого числа.

var i; var valueList = new Array(1,1,1,1,1,1,1,1,1);
for(i=0;i<6;i++)
{
var ranNum = utils.getRandomInt(0,8);
if(valueList[ranNum]<3) valueList[ranNum]+=1;
else i--;
}

только что проверил его, изменил <= 6 на <6, и это работает для меня.Удачи! </p>

0 голосов
/ 06 января 2012

Следующая логика должна работать.Вы должны выбрать случайное значение (в пределах 1-3), чтобы выбор не привел к невозможности выбора случайного значения для следующих слотов.

var gridLeft = 9
var valueLeft = 15
while(gridLeft>0) {
  var ranValue
  while(true) {
    ranValue = utils.getRandomInt(1,3);
    if (valueLeft-ranValue > 3*(gridLeft-1))
      continue;
    else if (valueLeft-ranValue < 1*(gridLeft-1))
      continue;
    else
      break;
  }

  valueList.push(ranValue);
  valueLeft -= ranValue;
  gridLeft -= 1
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...