| 12
 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;
} |