El trabajo con aleatorios es más complicado de lo que parece a primera vista, entre otras cosas porque es difícil garantizar una aletoriedad uniforme. Como cosas que es necesario saber:
srand (time(NULL)); Sirve para inicializar el generador de números aleatorios
int variable = rand(); Sirve para obtener un número aleatorio entre cero y un valor muy grande
Para obtener un número aleatorio comprendido entre 0 y x escribiríamos srand()%x. El resultado de esta operación será 0, 1, 2, 3, 4, 5, 6, 7 ... x, dado que x es el resto de la división entre un número muy grande y x, este resto puede ser 0 si la división es exacta, ó 1, 2, ... hasta x.
Si escribes A[ x ]=(rand()%9)+10; el número aleatorio no será entre 0 y 29, sino entre 10 y 19
El siguiente código sirve para hacer lo que se pretende, aunque se podría mejorar:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int numeroAleatorio[9]; //Indices de 0 a 9, resultan 10 numeros
int i, j;
int hayRepeticiones;
srand (time(NULL));
for (i=0; i<=9; i++) {
numeroAleatorio[i] = rand()%29;
}
hayRepeticiones = 1;
//Comprobar repeticiones
while (hayRepeticiones == 1) {
hayRepeticiones =0;
for (i=0; i<=9; i++) {
for (j=i+1; j<=9; j++) {
if (numeroAleatorio[i] == numeroAleatorio[j] && numeroAleatorio[i] !=29) { //Repetición
printf("Hay repeticion. Cambio de %d por %d \n", numeroAleatorio[i], numeroAleatorio[i]+1);
numeroAleatorio[i] = numeroAleatorio[i] +1;
hayRepeticiones = 1;
}
if (numeroAleatorio[i] == numeroAleatorio[j] && numeroAleatorio[i] ==29) { //Repetición
numeroAleatorio[i] = numeroAleatorio[i] -rand()%28+1;
printf("Hay repeticion de 29. Cambio de 29 por %d \n", numeroAleatorio[i]);
hayRepeticiones = 1;
}
}
}
}
for (i=0; i<=9; i++) {
printf("Aleatorio %d vale: %d\n", i, numeroAleatorio[i]);
}
return 0;
}