Генерация массива, без повтора

Squats

Новичок
Вообщем продолжаю тему массивов.
Так-как, все-же, хочется побольше узнать о них и разных алгоритмов генерации и патернов.

Средствами генерации через цикл for, пытаюсь сделать массив разной длины:
PHP:
$map = [];
$minNum = 0;
$maxNum = 50;
$matrixNum = 5;
for ($i = 0; $i<= $matrixNum; ++$i) {
    $map[$i] = mt_rand($minNum, $maxNum);
}
Потом мне понадобилось разделить его по 3:
PHP:
$map = array_chunk($map, 3);
Получается, как бы все верно, работает:
PHP:
var_dump($map);
Выводит:
PHP:
[
    [1, 1, 2],
    [0, 0, 7],
    [5, 6, 12],
    //........
];
Но вообщем мне нужно, чтобы не повторялись числа, как тут: [1, 1, 2] или тут: [0, 0, 7].
Я как бы понял, что я для этого ничего не сделал, чтобы они не повторялись, но я не могу сообразить, что нужно сделать.
Как правильно сгенерить такой массив, который я потом к примеру разделю на 3 части и повторов не будет.

И вообще, реально ли это?
 

fixxxer

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

Тут уже сама постановка задачи добавляет трудности:
Как правильно сгенерить такой массив, который я потом к примеру разделю на 3 части и повторов не будет.
Куда проще будет так:
1) сгенерировать массив, в котором N случайных чисел и они разные
2) сгенерировать массив, состоящий из M массивов из п.1

Так сразу выглядит проще, правда?
Каждый пункт реализуется отдельной функцией.
Причем решать можно в любой последовательности. п.2 явно проще, можно начать с него. Для начала п.1 можно временно упростить, временно убрав условие про то, что числа разные.

Про массивы тут вообще ничего знать не надо, кроме того, как в них добавлять элемент :)
Арифметика и логика.
 

AnrDaemon

Продвинутый новичок
Если ты собираешься тасовать колоду карт, то у тебя нет другого варианта, кроме как сначала создать эту колоду целиком.
 

fixxxer

К.О.
Партнер клуба
Если ты собираешься тасовать колоду карт, то у тебя нет другого варианта, кроме как сначала создать эту колоду целиком.
Ну почему нет? Особенно если надо три карты из колоды?

Другое дело, что тут, конечно, не совсем банально, надо подумать :)
 

Squats

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

Тут уже сама постановка задачи добавляет трудности:

Куда проще будет так:
1) сгенерировать массив, в котором N случайных чисел и они разные
2) сгенерировать массив, состоящий из M массивов из п.1

Так сразу выглядит проще, правда?
Каждый пункт реализуется отдельной функцией.
Причем решать можно в любой последовательности. п.2 явно проще, можно начать с него. Для начала п.1 можно временно упростить, временно убрав условие про то, что числа разные.

Про массивы тут вообще ничего знать не надо, кроме того, как в них добавлять элемент :)
Арифметика и логика.
Это реально спасло.

PHP:
$map = [];
$minNum = 0;
$maxNum = 50;
$matrixNum = 20;
for ($i = 0; $i<= $matrixNum; ++$i) {
    if($map[$i] === $map[$i+1] || $map[$i] === $map[$i-1]) {
        $map[$i] = mt_rand($minNum, $maxNum);
    } else {
        $map[$i] = mt_rand($minNum, $maxNum);
    }
}
var_dump(array_chunk($map,3));
Все -же остались хорошие люди, кто всегда объяснит,натолкнет, поможет.
Это радует!
 

fixxxer

К.О.
Партнер клуба
Ты что-то странное написал. Во-первых, в if и else одно и то же, во-вторых, заглядываешь в плюс один, где пока ещё пусто. Это не будет правильно работать.

попробуй обойтись без array_chunk и сгенерировать массив массивов по три на лету. Пусть пока без требования уникальности.
 

Squats

Новичок
Да походу, после деления, нужно обходить и сравнивать одно с другим и если совпадает, то заменять другим.
Только я не врубаюсь, но все равно же может попасться.
Как -же так сделать то....

Просто допустим, генерим, делим, после проходим, находим, сравнимаем, генерим новое число, но оно же опять может попасться, это же сколько условий и циклов еще надо будет написать?((((
 

fixxxer

К.О.
Партнер клуба
Так, погоди. Тебе же в рамках тройки надо уникальные? Не вообще?

[ [1,2,3],[1,2,4] ] такое же годится?
 

fixxxer

К.О.
Партнер клуба
Но зачем ты тогда упорно пытаешься решить все в один заход?
Научись генерировать массив из трёх чисел. Сгенерировал массив из тройки - добавил в другой массив, который будет содержать массивы этих троек. Никакого разбиения с использованием array_chunk не понадобится, все сразу сляжет как надо.
В массиве из трёх можно и в лоб - проверять, не было ли уже числа - тут же максимум два элемента проверить, вероятность, что все время будут выпадать одни и те же два числа, небольшая. (Можно и гарантированное время сделать, чтобы ни одного лишнего вызова rand не было, но это заметно сложнее, давай пока так)
 

Squats

Новичок
Вроде получилось =)))

PHP:
$map = [];
$minNum = 0;
$maxNum = 20;
$matrixNum = 10;
$size = 3;
for ($i = 0; $i <= $matrixNum; ++$i) {
    $numbers = range($minNum, $maxNum);
    shuffle($numbers);
    $map[$i] = array_slice($numbers, 0, $size);
}
 

fixxxer

К.О.
Партнер клуба
Да, для небольшого range так норм. Можно сэкономить, делая range один раз вначале - какая разница, из какого состояния колоду карт перетасовывать?

а вот если бы maxNum был в районе миллиона так уже было бы не очень.
 

Squats

Новичок
Да, для небольшого range так норм. Можно сэкономить, делая range один раз вначале - какая разница, из какого состояния колоду карт перетасовывать?

а вот если бы maxNum был в районе миллиона так уже было бы не очень.
Могут быть только 2х значные максимально = 99.
По этому спасибо за наводку мисье =)))
 
Сверху