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

  • Автор темы Автор темы Hidalgo
  • Дата начала Дата начала

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
Ты забыл рассказать в этом топике про честное горизонтальное масштабирование!!! ))))
 
джоин сам себя и группировка
расскажи, кстати, подробнее, как одним (??) джоином можно получить такой результат?

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

Количество строк в таблице может быть любым, но не больше 50, это факт. Хотя может и это многовато.
Перед генерации таблицы, уже заранее известно сколько будет строк.
 
Нет, это не то. То что я указал в таблице для примера, это просто пример. Т.е. таблица должна заполняться случайно.
Еще варианты есть?
Что значит «случайно»? Выборка из базы по случайному порядку?
 
каждая строчка, начиная со второй, стартует с элемента с соответствующим номером из первой строки, далее соседятся сначала.
так нагляднее:
1234
2341
3412
4123

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

И матрица тоже 50х50 может быть?
 
каждая строчка, начиная со второй, стартует с элемента с соответствующим номером из первой строки, далее соседятся сначала.
так нагляднее:
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]];
		}
	}
 
А потом в полученной матрице случайным образом переставляем столбики и строки:
[/php]
Честно говоря я не проверял Ваш код, но с первого взгляда:
зачем перемешивать shuffle($vert) ?
К примеру таким образом генерятся вертикальные столбцы, а горизонтальные строки просто перемешиваются, главное что бы не было совпадений.
Т.е. если известно 10 чисел, от 1 до 10 к примеру, то это "матрица" 10х10 = 100 вариантов, составленная из этого диапазона случайным образом, и что бы ни по горизонтали, ни по вертикали не было повторных строк и столбцов.
Как то так ((
 
Ещё можно построить симметричную матрицу (MxM), где M-количество строк и взять оттуда N рандомных строк
 
Т.е. если известно 10 чисел, от 1 до 10 к примеру, то это "матрица" 10х10 = 100 вариантов, составленная из этого диапазона случайным образом, и что бы ни по горизонтали, ни по вертикали не было повторных строк и столбцов.
— берём эти 10 чисел и делаем с ними:
array_shift() и array_push() в цикле.
— что непонятно-то?
 
— берём эти 10 чисел и делаем с ними:

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