Используйте ваш первый действительный пример:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
Затем создайте случайным образом 2 перестановки {1, 2, 3, 4}.
Используйте первую для перестановки строк, а затем вторую для перестановки столбцов.
Вы можете найти несколько способов создания перестановок в книге Кнута Искусство компьютерного программирования (TAOCP) , том 4, глава 2, Генерация всех кортежей и перестановок (2005), v + 128pp. ISBN 0-201-85393-0.
Если вы не можете найти копию в библиотеке, препринт (той части, которая обсуждает перестановки) доступен на его сайте: asc2b.ps.gz
РЕДАКТИРОВАТЬ - ИСПРАВЛЕНИЕ
Приведенное выше решение аналогично 500-Intenral Server Error. Но я думаю, что оба не найдут все действительные меры.
Например, они найдут:
1 3 2 4
3 1 4 2
2 4 1 3
4 2 3 1
но не этот:
1 2 3 4
2 1 4 3
3 4 1 2
4 3 2 1
Требуется еще один шаг: после перестановки строк и столбцов (используя метод my или 500) создайте еще одну перестановку (назовем ее s3
) и используйте ее для перестановки всех чисел в массиве.
s3 = randomPermutation(1 ... n)
for i=1 to n
for j=1 to n
array[i,j] = s3( array[i,j] )