{"id":59,"date":"2016-09-07T02:16:13","date_gmt":"2016-09-07T02:16:13","guid":{"rendered":"http:\/\/marcjuneau.ca\/?p=59"},"modified":"2016-09-07T02:22:15","modified_gmt":"2016-09-07T02:22:15","slug":"mode-aleatoire-sans-remise","status":"publish","type":"post","link":"https:\/\/marcjuneau.ca\/?p=59","title":{"rendered":"Mode al\u00e9atoire sans remise"},"content":{"rendered":"<p>Faire une s\u00e9lection al\u00e9atoire en programmation est relativement simple. On d\u00e9limite l&rsquo;\u00e9tendue et avec une fonction pseudo-al\u00e9atoire, on demande un nombre born\u00e9 par cette \u00e9tendue.<\/p>\n<p>Par exemple, pour obtenir un nombre entre 0 et 9, il suffit d&rsquo;appeler la fonction rand() et de faire le modulo sur 10.<\/p>\n<pre>nombreAleatoire = rand() % 10;<\/pre>\n<p>Lorsque l&rsquo;on d\u00e9sire que les nombres soient sans remise, c&rsquo;est plus compliqu\u00e9. Un mode sans remise, c&rsquo;est comparable au boulier de la loto. Lorsque le num\u00e9ro est utilis\u00e9, il ne peut plus ressortir.<\/p>\n<p>Mon premier algorithme fut de cr\u00e9er un tableau d&rsquo;entiers, de la dimension de mon tirage ( disons 10 pour continuer l&rsquo;exemple) avec tous les \u00e9l\u00e9ments \u00e0 z\u00e9ro. Lorsqu&rsquo;un \u00e9l\u00e9ment \u00e9tait utilis\u00e9, je pla\u00e7ais la valeur dans la case correspondante \u00e0 1. Si la case \u00e9tait d\u00e9j\u00e0 \u00e0 1, alors je retirais jusqu&rsquo;\u00e0 ce que j&rsquo;obtienne un nombre dont la case du tableau \u00e9tait toujours \u00e0 z\u00e9ro. Je devais aussi m&rsquo;assurer qu&rsquo;il restait des cases \u00e0 0 pour continuer, sinon je red\u00e9marrais le tirage avec tous \u00e0 z\u00e9ro de nouveau.<\/p>\n<p>Ce qui me d\u00e9range de cet algorithme, c&rsquo;est la perte de temps lorsqu&rsquo;il y a des tirages multiples pour trouver une valeur jamais encore utilis\u00e9e. Plus le nombre de cases \u00e0 0 diminue, plus \u00e7a demande des tirages pour obtenir un nouveau nombre.<\/p>\n<p>Mon nouvel\u00a0algorithme est bas\u00e9 sur les \u00e9changes de valeurs dans les tris. Ainsi, l&rsquo;algorithme d\u00e9marre avec un tableau dont le contenu des cases correspond \u00e0 l&rsquo;index de la case. Puis lorsqu&rsquo;une valeur est tir\u00e9e, la valeur de la case est prise, puis \u00e9chang\u00e9e pour la valeur de la derni\u00e8re case du tableau. Aussi, une variable qui indique la dimension du tableau est diminu\u00e9e. Cette variable indique l&rsquo;\u00e9tendue recherch\u00e9e. Lorsque cette variable arrive \u00e0 0, l&rsquo;algorithme red\u00e9marre. Voici ce que \u00e7a donne en code, pour notre exemple.<\/p>\n<pre>#define _RAND_SIZE 10\r\nuint8_t size = 0;\r\nuint8_t valeurs[_RAND_SIZE];\r\n\r\nvoid rand_init()\r\n{\r\n  for( int i = 0 ; i &lt; _RAND_SIZE ; i++ )\r\n     valeurs[i] = i;\r\n  size = _RAND_SIZE; \r\n}\r\n\r\nuint8_t rand_next()\r\n{\r\n  uint8_t index = 0; \r\n  uint8_t val = 0;\r\n  if(size==0)\r\n    rand_init();\r\n  \r\n  if(size)\r\n  {\r\n    index = rand() % size;\r\n    val = values[index];\r\n    values[index] = values[size-1];\r\n    size--;    \r\n  }\r\n  return val;\r\n}<\/pre>\n<p>Il suffit d&rsquo;appeler la fonction rand_next() pour obtenir un nombre al\u00e9atoire sans remise sur l&rsquo;\u00e9tendue sp\u00e9cifi\u00e9e par _RAND_SIZE.<\/p>\n<p>Cet algorithme est plus stable en performance, car son temps d&rsquo;ex\u00e9cution est le m\u00eame sauf lors de l&rsquo;initialisation.<\/p>\n<p>Contactez-moi si vous avez une version encore plus efficase.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Faire une s\u00e9lection al\u00e9atoire en programmation est relativement simple. On d\u00e9limite l&rsquo;\u00e9tendue et avec une fonction pseudo-al\u00e9atoire, on demande un nombre born\u00e9 par cette \u00e9tendue. Par exemple, pour obtenir un nombre entre 0 et 9, il suffit d&rsquo;appeler la fonction rand() et de faire le modulo sur 10. nombreAleatoire =<span class=\"more-link\"><a href=\"https:\/\/marcjuneau.ca\/?p=59\">Continue Reading<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["entry","author-mjuneau","post-59","post","type-post","status-publish","format-standard","category-cc"],"_links":{"self":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/59","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=59"}],"version-history":[{"count":3,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions"}],"predecessor-version":[{"id":62,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/59\/revisions\/62"}],"wp:attachment":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=59"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=59"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=59"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}