2012-07-03 19 views
5

I necesitan números aleatorios generados en el rango [0, 10] tales que:Generar "en rango" números aleatorios en C

  • Todos los números ocurren una vez.
  • No se obtienen resultados repetidos.

¿Puede alguien por favor me guía en qué algoritmo usar?

+7

generar una) secuencia [0, 10 y barájalo. – cnicutar

+3

Primero, [¿qué has probado?] (Http://whathaveyoutried.com) Segundo, ¿cuál es, 0-10 o 1-10? –

+0

Hola Carl, he intentado generar la secuencia con la función rand(), pero no pude lograr el resultado. En segundo lugar, el rango mencionado anteriormente es de 0 a 10. Gracias –

Respuesta

1

probar este algoritmo para números pseudo-aleatorios:

int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
srand(time(NULL)); 

for (int i = 0; i < 11; i++) 
{ 
    int swap1idx = rand() % 11; 
    int swap2idx = rand() % 11; 

    int tmp = values[swap1idx]; 
    values[swap1idx] = values[swap2idx]; 
    values[swap2idx] = tmp; 
} 

// now you can iterate through the shuffled values array. 

Tenga en cuenta que esto está sujeto a un sesgo de módulo, pero debería funcionar para lo que necesita.

+0

@slashmais el OP no era claro, pero fijo, de todos modos. –

11

El algoritmo en la respuesta de Richard J. Ross es incorrecto. Genera n^n posibles pedidos en lugar de n!. Este post en el blog de Jeff Atwood ilustra el problema: http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html

su lugar, debe utilizar el Knuth-Fisher-Yates aleatoria:

int values[11] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
srand(time(NULL)); 

for (int i = 10; i > 0; i--) 
{ 
    int n = rand() % (i + 1); 

    int temp = values[n]; 
    values[n] = values[i]; 
    values[i] = temp; 
} 
+1

¿Es el Knuth o el Fisher-Yates-shuffle [http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle]? También está aquí: http://stackoverflow.com/questions/1150646/card-shuffling-in-c-sharp – slashmais

+0

Mismo algoritmo, pero he corregido el nombre. – japreiss

+0

En la página wikipedia es aka Knuth-shuffle - Debería haber leído la introducción, no solo haber descendido los detalles;) – slashmais

0

intenta crear una función randomize, así:

void randomize(int v[], int size, int r_max) { 
    int i,j,flag; 

    v[0] = 0 + rand() % r_max; // start + rand() % end 
    /* the following cycle manages, discarding it, 
the case in which a number who has previously been extracted, is re-extracted. */ 
    for(i = 1; i < size; i++) { 
     do { 
      v[i]= 0 + rand() % r_max; 
      for(j=0; j<i; j++) { 
       if(v[j] == v[i]) { 
        flag=1; 
        break; 
       } 
       flag=0; 
      } 
     } while(flag == 1); 
    } 
} 

Luego, simplemente llamarlo pasar una matriz v[] de 11 elementos, su tamaño, y el rango superior:

randomize(v, 11, 11); 

La matriz, debido a que se pasa como argumento por referencia, se aleatorizará, sin repeticiones y con números una vez.

recuerde llamar srand(time(0)); antes de llamar al randomize, y para inicializar int v[11]={0,1,2,3,4,5,6,7,8,9,10};

Cuestiones relacionadas