comunque la random_shuffle delle STL usa questo algoritmo

pseudocodice

codice:
FOR I = 1 TO N-1 DO
  R = numero a caso nell'intervallo [0, i]
  scambia v[I] <-> v[R]
END
in C

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;
}
Questo algoritmo ideato da D.Knuth, ha complessità di tempo lineare.