1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
   | #include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define ARRAY_SIZE(arr) ( sizeof (arr) / sizeof *(arr) )
 
/* -tc- Voir: http://c.developpez.com/faq/?page=nombres#NOMBRES_random_bornes */
int alea(int n)
{
   int partSize   = (n == RAND_MAX) ? 1 : 1 + (RAND_MAX - n)/(n+1);
   int maxUsefull = partSize * n + (partSize-1);
   int draw;
 
   do
   {
      draw = rand();
   } while (draw > maxUsefull);
   return draw/partSize;
}
 
/* -tc- Utilise l'algorithme de Fisher & Yates */
int shuffle(int *a, size_t size_a)
{
    int err = 0;
 
    if (a != NULL && size_a > 1)
    {
        size_t n = size_a;
 
        while (--n > 0)
        {
            /* -tc- k est un entier aleatoire entre 0 et n */
            size_t k = alea(n);
 
            if (k != n)
            {
                /* -tc- On echange le k-eme et le n-eme element */
                int tmp = a[n];
                a[n] = a[k];
                a[k] = tmp;
            }
        }
    }
    else
    {
        /* Erreur: argument invalide */
        err = 1;
    }
    return err;
}
 
/* -tc- Dans ce programme, on desire afficher aleatoirement 5 nombres parmi
   l'ensemble {0,1,2,3,4,5,6,7,8,9} sans repetition */
int main(void)
{
    int nombres[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    size_t n = 5;
    size_t i;
 
    srand(time(NULL));
    shuffle(nombres, ARRAY_SIZE(nombres));
 
    for (i = 0; i < ARRAY_SIZE(nombres) && i < n; i++)
    {
        printf("%d ", nombres[i]);
    }
    printf("\n");
 
    return 0;
} | 
Partager