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?
I necesitan números aleatorios generados en el rango [0, 10] tales que:Generar "en rango" números aleatorios en C
¿Puede alguien por favor me guía en qué algoritmo usar?
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.
@slashmais el OP no era claro, pero fijo, de todos modos. –
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;
}
¿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
Mismo algoritmo, pero he corregido el nombre. – japreiss
En la página wikipedia es aka Knuth-shuffle - Debería haber leído la introducción, no solo haber descendido los detalles;) – slashmais
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};
generar una) secuencia [0, 10 y barájalo. – cnicutar
Primero, [¿qué has probado?] (Http://whathaveyoutried.com) Segundo, ¿cuál es, 0-10 o 1-10? –
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 –