Thicket data repository for the EEG
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><-</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><-</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>-></span> <span>(</span><span>Random</span><span>.</span><span>bits</span> <span>()</span><span>,</span> <span>x</span><span>))</span> <span>lst</span> <span>|></span> <span>List</span><span>.</span><span>sort</span> <span>compare</span> <span>|></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}