Ecco un esempio in "C", facilmente utilizzabile anche in C++ (modificando innanzitutto gli include).
codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct
{
int *values;
int size;
} UNIQUE_RANDOM;
int rand_int (int min, int max)
{
double d;
d = rand () / (RAND_MAX+1.0);
return ((int) (d * (max-min+1))) + min;
}
int UniqueRandom_Init (UNIQUE_RANDOM *ur, int min, int max)
{
int size, i;
int *values;
if (min > max)
return 0;
size = max - min + 1;
values = (int*) malloc (size * sizeof (int));
if (values == NULL)
return 0;
for (i = 0; i < size; i++)
values[i] = min + i;
ur->values = values;
ur->size = size;
return 1;
}
int UniqueRandom_Extract (UNIQUE_RANDOM *ur, int *value_out)
{
int idx;
if (ur == NULL || value_out == NULL || ur->size == 0)
return 0;
idx = rand_int (0, --ur->size);
*value_out = ur->values[idx];
ur->values[idx] = ur->values[ur->size];
return 1;
}
void UniqueRandom_Free (UNIQUE_RANDOM *ur)
{
if (ur != NULL && ur->values)
free (ur->values);
}
/*-- Main di prova --*/
int main (void)
{
UNIQUE_RANDOM ur;
int num;
srand ((unsigned int) time (NULL));
if (UniqueRandom_Init (&ur, -10, 10))
{
while (UniqueRandom_Extract (&ur, &num))
printf ("%d ", num);
printf ("\n");
UniqueRandom_Free (&ur);
}
return 0;
}