comunque la random_shuffle delle STL usa questo algoritmo
pseudocodice
in Ccodice:FOR I = 1 TO N-1 DO R = numero a caso nell'intervallo [0, i] scambia v[I] <-> v[R] END
Questo algoritmo ideato da D.Knuth, ha complessità di tempo lineare.codice:#include <stdio.h> #include <stdlib.h> #include <time.h> int my_random(int max) { return (int)((rand()/(double)(RAND_MAX)) * max); } /* permuta in maniera casuale gli elementi dell'array <v> complessita' di tempo: THETA(n) */ void my_random_shuffle(int v[], int n) { int i; for (i = 1; i < n; i++) { /* r numero a caso nell'intervallo [0, i] */ int r = my_random(i); /* scambia: v[i] <-> v[r] */ int t = v[i]; v[i] = v[r]; v[r] = t; } } #define MAX_NUM 90 int main() { int num[MAX_NUM], i, j; srand(time(NULL)); for (i = 0; i < MAX_NUM; i++) num[i] = i+1; my_random_shuffle(num, MAX_NUM); for (i = 0; i < MAX_NUM; i += 5) { for (j = 0; j < 5; j++) printf("%3d ", num[i+j]); putchar('\n'); } return 0; }

Rispondi quotando