{"id":1278,"date":"2022-02-18T13:14:58","date_gmt":"2022-02-18T13:14:58","guid":{"rendered":"http:\/\/www.netexl.com\/blog\/?p=1278"},"modified":"2026-04-02T09:21:17","modified_gmt":"2026-04-02T09:21:17","slug":"generate-latin-square-of-any-size-in-jvascript","status":"publish","type":"post","link":"https:\/\/www.netexl.com\/blog\/generate-latin-square-of-any-size-in-jvascript\/","title":{"rendered":"Generate Latin Square of any size in Jvascript"},"content":{"rendered":"\n<p>A useful code I found online. Posting here for future reference. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ returns a random integer in the range &#91;a, b] (inclusive)\r\nfunction rnd(a, b) {\r\n    let x = Math.floor(Math.random() * (b - a + 1));\r\n    return a + x;\r\n}\r\n\r\n\/\/ returns a random latin square\r\nfunction latinSquare(size) {\r\n    let b, i, j, m, n;\r\n    b = &#91;];\r\n    \/\/ legally populate board by shifting each row by one\r\n    for (i = 0; i &lt; size; i++) {\r\n        b&#91;i] = &#91;];\r\n        for (j = 0; j &lt; size; j++) {\r\n            b&#91;i]&#91;j] = ((i + j) % size) + 1;\r\n        }\r\n    }\r\n    \/\/ shuffle rows\r\n    for (m = size - 1; m > 0; m--) {\r\n        n = rnd(0, m); \/\/ 0 &lt;= n &lt;= m\r\n        swapRows(b, m, n);\r\n    }\r\n    \/\/ shuffle cols\r\n    for (m = size - 1; m > 0; m--) {\r\n        n = rnd(0, m); \/\/ 0 &lt;= n &lt;= m\r\n        swapCols(b, m, n);\r\n    }\r\n    return b;\r\n}\r\n\r\n\/\/ swaps two rows in a latin square\r\nfunction swapRows(a, m, n) {\r\n    let swap = a&#91;m];\r\n    a&#91;m] = a&#91;n];\r\n    a&#91;n] = swap;\r\n}\r\n\r\n\/\/ swaps two columns in a latin square\r\nfunction swapCols(a, m, n) {\r\n    let j, swap;\r\n    for (j = 0; j &lt; a&#91;m].length; j++) {\r\n        swap = a&#91;j]&#91;m];\r\n        a&#91;j]&#91;m] = a&#91;j]&#91;n];\r\n        a&#91;j]&#91;n] = swap;\r\n    }\r\n}\r\n\r\nlet latin = latinSquare(8);\r\nconsole.log(latin);\r<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>A useful code I found online. Posting here for future reference.<\/p>\n","protected":false},"author":5,"featured_media":1539,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[33,24,22,34],"tags":[],"class_list":["post-1278","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-code","category-javascript","category-quick-tip","category-useful"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/posts\/1278","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/comments?post=1278"}],"version-history":[{"count":1,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/posts\/1278\/revisions"}],"predecessor-version":[{"id":1279,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/posts\/1278\/revisions\/1279"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/media\/1539"}],"wp:attachment":[{"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/media?parent=1278"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/categories?post=1278"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.netexl.com\/blog\/wp-json\/wp\/v2\/tags?post=1278"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}