Thicket data repository for the EEG
at main 2.7 kB view raw
1{ 2 "id": "https://www.tunbury.org/2025/08/04/list-shuffle", 3 "title": "Shuffling Lists", 4 "link": "https://www.tunbury.org/2025/08/04/list-shuffle/", 5 "updated": "2025-08-04T00:00:00", 6 "published": "2025-08-04T00:00:00", 7 "summary": "Shuffling a list into a random order is usually handled by the Fisher-Yates Shuffle.", 8 "content": "<p>Shuffling a list into a random order is usually handled by the <a href=\"https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle\">Fisher-Yates Shuffle</a>.</p>\n\n<p>It could be efficiently written in OCaml using arrays:</p>\n\n<div><div><pre><code><span>Random</span><span>.</span><span>self_init</span> <span>()</span><span>;</span>\n\n<span>let</span> <span>fisher_yates_shuffle</span> <span>arr</span> <span>=</span>\n <span>let</span> <span>n</span> <span>=</span> <span>Array</span><span>.</span><span>length</span> <span>arr</span> <span>in</span>\n <span>for</span> <span>i</span> <span>=</span> <span>n</span> <span>-</span> <span>1</span> <span>downto</span> <span>1</span> <span>do</span>\n <span>let</span> <span>j</span> <span>=</span> <span>Random</span><span>.</span><span>int</span> <span>(</span><span>i</span> <span>+</span> <span>1</span><span>)</span> <span>in</span>\n <span>let</span> <span>temp</span> <span>=</span> <span>arr</span><span>.</span><span>(</span><span>i</span><span>)</span> <span>in</span>\n <span>arr</span><span>.</span><span>(</span><span>i</span><span>)</span> <span>&lt;-</span> <span>arr</span><span>.</span><span>(</span><span>j</span><span>);</span>\n <span>arr</span><span>.</span><span>(</span><span>j</span><span>)</span> <span>&lt;-</span> <span>temp</span>\n <span>done</span>\n</code></pre></div></div>\n\n<p>However, I had a one-off requirement to randomise a list, and this approach felt very <em>functional</em>.</p>\n\n<div><div><pre><code><span>Random</span><span>.</span><span>self_init</span> <span>()</span><span>;</span>\n\n<span>let</span> <span>shuffle</span> <span>lst</span> <span>=</span>\n <span>List</span><span>.</span><span>map</span> <span>(</span><span>fun</span> <span>x</span> <span>-&gt;</span> <span>(</span><span>Random</span><span>.</span><span>bits</span> <span>()</span><span>,</span> <span>x</span><span>))</span> <span>lst</span> <span>|&gt;</span> <span>List</span><span>.</span><span>sort</span> <span>compare</span> <span>|&gt;</span> <span>List</span><span>.</span><span>map</span> <span>snd</span>\n</code></pre></div></div>", 9 "content_type": "html", 10 "author": { 11 "name": "Mark Elvers", 12 "email": "mark.elvers@tunbury.org", 13 "uri": null 14 }, 15 "categories": [ 16 "ocaml", 17 "tunbury.org" 18 ], 19 "source": "https://www.tunbury.org/atom.xml" 20}