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