Рандом типа судоку

Hidalgo

Новичок
Здравствуйте!
Ломаю голову над задачкой...

Есть таблица mysql:
id name
1 Vasya
2 Petya
3 Vania
4 Sasha

Нужно на php создать таблицу похожую на эту:

Vasya Petya Vania Sasha
Petya Vania Sasha Vasya
Vania Sasha Vasya Petya
Sasha Vasya Petya Vania

Т.е. что бы ни строки ни столбцы не повторялись.
Рандом сделать не проблема, проблема в том, что бы не было повторов.
Понимаю что может это и примитив, но я реально не соображу как это сделать :)
Буду благодарен за информативные советы!
 

DiMA

php.spb.ru
Команда форума
джоин сам себя и группировка
что, опять на собеседовании напрягают?
 

zerkms

TDD infected
Команда форума
DiMA
Ты забыл рассказать в этом топике про честное горизонтальное масштабирование!!! ))))
 

zerkms

TDD infected
Команда форума
джоин сам себя и группировка
расскажи, кстати, подробнее, как одним (??) джоином можно получить такой результат?

Если же число строк известно, тогда никакой группировки не нужно.
 

Hidalgo

Новичок
Нет не собеседование, работа у меня слава богу есть, а в институты поступать уже поздно (хотя учиться - никогда не поздно) :)

Количество строк в таблице может быть любым, но не больше 50, это факт. Хотя может и это многовато.
Перед генерации таблицы, уже заранее известно сколько будет строк.
 

baev

‹°°¬•
Команда форума
Нет, это не то. То что я указал в таблице для примера, это просто пример. Т.е. таблица должна заполняться случайно.
Еще варианты есть?
Что значит «случайно»? Выборка из базы по случайному порядку?
 

Breeze

goshogun
Команда форума
Партнер клуба
каждая строчка, начиная со второй, стартует с элемента с соответствующим номером из первой строки, далее соседятся сначала.
так нагляднее:
1234
2341
3412
4123

upd: ы, уже опередили
 

Breeze

goshogun
Команда форума
Партнер клуба
Количество строк в таблице может быть любым, но не больше 50, это факт. Хотя может и это многовато.
Перед генерации таблицы, уже заранее известно сколько будет строк.
И матрица тоже 50х50 может быть?
 

partizan

Новичок
каждая строчка, начиная со второй, стартует с элемента с соответствующим номером из первой строки, далее соседятся сначала.
так нагляднее:
1234
2341
3412
4123

upd: ы, уже опередили
А потом в полученной матрице случайным образом переставляем столбики и строки:

PHP:
$elements = array(1, 2, 3, 4);
	$n = count($elements);
	
	$elements2 = $elements;
	
	$res = array();
	for ($i=0; $i<$n; $i++)
	{
		$res[$i] = $elements2;
		
		$x = array_shift($elements2);		
		$elements2[] = $x;
	}
	
	$vert = array_keys($elements);
	$hor = array_keys($elements);
	
	shuffle($vert);
	shuffle($hor);
	
	$res2 = array();
	for ($i=0; $i<$n; $i++)
	{
		$res2[$i] = array();
		for ($j=0; $j<$n; $j++)
		{
			$res2[$i][$j] = $res[$hor[$i]][$vert[$j]];
		}
	}
 

Hidalgo

Новичок
А потом в полученной матрице случайным образом переставляем столбики и строки:
[/php]
Честно говоря я не проверял Ваш код, но с первого взгляда:
зачем перемешивать shuffle($vert) ?
К примеру таким образом генерятся вертикальные столбцы, а горизонтальные строки просто перемешиваются, главное что бы не было совпадений.
Т.е. если известно 10 чисел, от 1 до 10 к примеру, то это "матрица" 10х10 = 100 вариантов, составленная из этого диапазона случайным образом, и что бы ни по горизонтали, ни по вертикали не было повторных строк и столбцов.
Как то так ((
 

prolis

Новичок
Ещё можно построить симметричную матрицу (MxM), где M-количество строк и взять оттуда N рандомных строк
 

baev

‹°°¬•
Команда форума
Т.е. если известно 10 чисел, от 1 до 10 к примеру, то это "матрица" 10х10 = 100 вариантов, составленная из этого диапазона случайным образом, и что бы ни по горизонтали, ни по вертикали не было повторных строк и столбцов.
— берём эти 10 чисел и делаем с ними:
array_shift() и array_push() в цикле.
— что непонятно-то?
 

Hidalgo

Новичок
— берём эти 10 чисел и делаем с ними:

— что непонятно-то?
Ваш вариант не подходит, т.к. будет не рандом, а тупо переставление цифр в строках. Получится именно та таблица, которую я в своем вопросе изобразил. Т.е. по диагонали идет заисимость. А мне нужен рандом.
Скажу по другому.
Генерим первую строку. Потом вторую. Если есть повторы по горизонтали, вертикали или диагонали с предыдущими строками, генерим ее до тех пор пока не получим уникальную строку. И т.д.
 

baev

‹°°¬•
Команда форума
Ваш вариант не подходит, т.к. будет не рандом, а тупо переставление цифр в строках. Получится именно та таблица, которую я в своем вопросе изобразил. Т.е. по диагонали идет заисимость. А мне нужен рандом.
1. Про «зависимость по диагонали» Вы тут в первый раз написали.
2. Зачем надо было в первом сообщении рисовать не то, что Вам на самом деле надо?
3. Любое упорядочивание — а Вам надо именно упорядочивание — по определению исключает случайность. Так что, никакой «рандом» Вам на самом деле не нужен.
 
Сверху