Устранение повторения в рандомизированной матрице - PullRequest
2 голосов
/ 24 января 2012

Я пишу программу, которая предполагает размещение одного числа в каждой ячейке сетки 7x7. Есть 56 номеров, выбранных случайным образом, и не должно быть повторений.

Конечным результатом должна быть сетка 7x7, в которой каждая ячейка содержит целое число от 1 до 56, при этом не должно быть двух ячеек с одинаковым номером. Какой самый эффективный способ сделать это?

дополнительные слова: Я попытался создать для x {для y {}}, который будет проходить через ячейку сетки за ячейкой и добавлять случайное число 1-56. Затем он проверит массив из 56 слотов, чтобы увидеть, использовалось ли уже это число, и, соответственно, либо перекатит, либо примет номер, а затем пометит массив, чтобы пометить номер как используемый. По какой-то причине я не мог заставить его работать, и это казалось плохим решением. Я удалил его, и вместо этого имелась секунда для запуска x {для y {}} каждый раз, и проверял все ячейки сетки за ячейкой на предмет выпавшего числа, прежде чем утверждать или отклонять его. Это тоже не совсем работало и казалось громоздким, поэтому я тоже его пересмотрел.

Ответы [ 4 ]

1 голос
/ 24 января 2012

Вы можете создать массив 1:56, затем перемешать, а затем выбрать первые 49 элементов.

$arr = range(1,56);
shuffle($arr);
$vals = array_slice($arr, 0, 49); //49 because grid is 7x7

// put $vals in grid.
1 голос
/ 24 января 2012
  1. Создайте массив длиной 56, заполненный числами от 1 до 56

  2. Используйте случайный случай Фишера-Йейтса для создания несмещенного рандомизированного массива

  3. Заполнить матрицу 7x7 (порядок строк или столбцов) последовательно из массива.

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

Создайте массив со всеми необходимыми числами и перемешайте его.

$fullGrid = range($min, $max);
shuffle($fullGrid);

Теперь все, что вам нужно сделать, это визуально отобразить массив $fullGrid.

Подробнее о функции php shuffle.

0 голосов
/ 24 января 2012
  • Создать массив из 56 элементов, содержащий числа от 1 до 56.
  • Создать случайное число от 1 до длины массива
  • Выберите число по этому индексу иудалить его из массива
  • вспенить, промыть, повторить
...