Генерация случайных магических квадратов

Мне интересно, как создать матрицу со случайными натуральными числами, но с суммой каждого столбца, равной сумме каждой строки и диагональной суммы.

Я имею в виду, что вы создаете функцию, которая, выбирая размер и сумму строк, столбцов и диагоналей, дает вам квадратную матрицу, как описано выше, но с разными числами в каждой строке и столбце.

Кто-нибудь знает, как это сделать?

Я хочу создать функцию самостоятельно без каких-либо пакетов, чтобы полностью понять программу.


person Artur Si    schedule 30.05.2017    source источник
comment
Если сумма каждого столбца является суммой каждой строки, то многие числа зависят от других и не могут быть случайными.   -  person HubertL    schedule 30.05.2017
comment
Вы говорите о магическом квадрате? Советы по строительству можно найти в статье в Википедии.   -  person MrFlick    schedule 30.05.2017


Ответы (1)


Вы можете использовать пакет под названием magic:

library(magic)
magic(4)

вывод выглядит так:

#      [,1] [,2] [,3] [,4] 
# [1,]    1   12    8   13 
# [2,]   15    6   10    3 
# [3,]   14    7   11    2 
# [4,]    4    9    5   16

Вы не можете решить, какова сумма для матрицы. Это собирается быть:

введите здесь описание изображения.

Где n — размер матрицы.

Но вы можете умножить его на число (желательно целое).

Полезная ссылка: Что такое Magic Square?

Как заглянуть в функцию?

Если вы хотите понять, как работает функция magic, вы можете использовать ее и изучить ее шаг за шагом;

>functionBody(magic)

# { 
#     if (length(n) > 1) { 
#         return(sapply(n, match.fun(sys.call()[[1]]))) 
#     } 
#     n <- round(n) 
#     if (n == 2) { 
#         stop("Normal magic squares of order 2 do not exist") 
#     } 
#     if (n%%2 == 1) { 
#         return(as.standard(magic.2np1(floor(n/2)))) 
#     } 
#     if (n%%4 == 0) { 
#         return(as.standard(magic.4n(round(n/4)))) 
#     } 
#     if (n%%4 == 2) { 
#         return(as.standard(magic.4np2(round((n - 2)/4)))) 
#     } 
#     stop("This cannot happen") 
# }

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

person M--    schedule 30.05.2017