Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Hyde en 06 de Mayo 2014, 04:02

Título: Lenguaje C: Generar un vector de números aleatorios
Publicado por: Hyde en 06 de Mayo 2014, 04:02
Hola me gustaría que me ayuden a generar un vector de 10 números con números a la zar de 0 a 29 pero que los números NO se repitan.

por ejemplo para generar los numero a la zar hice lo siguiente:

Código: [Seleccionar]
//--Cargar un vector con números aleatorios
    srand(time(0)); //se establece el número semilla
    for(x=0;x<10;x++){
      A[x]=(rand()%9)+10;//se genera el número aleatorio  entre 0 y 29
    }//for
   
    printf("\n Vector A cargado con números aleatorios entre 0 y 29 \n\n");   
    for(x=0;x<10;x++){
      printf("\n\t%d\t",A[x]);
    }

¿Como hago que no se repitan?, por ahí leí que con un While se podía, pero ¿me podrían explicar como?, Un saludo y Disculpen las molestias como verán soy novata en esto y se me hace algo difícil esto.
Título: Re:Lenguaje C: Generar un vector
Publicado por: Hyde en 06 de Mayo 2014, 04:03
Conseguí esto por Internet pero de todas maneras no lo entiendo. y tampoco se si esta es la respuesta para generar el numero sin que se repita?

Código: [Seleccionar]
n=0;
while (n<25){
a=round(100*rand)
i=0;
existe=0;
while (i<n & existe=0){
i=i + 1;
}
if (m(1,i)=a){
existe=1;
}//if
}//while i

if existe=0{
n = n + 1; 
m(1,n)=a; 
}//if
}//While n
Título: Re:Lenguaje C: Generar un vector de números aleatorios
Publicado por: César Krall en 06 de Mayo 2014, 09:23
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:

Código: [Seleccionar]
#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;

}
Título: Re:Lenguaje C: Generar un vector de números aleatorios
Publicado por: Hyde en 07 de Mayo 2014, 23:03
Ahora tengo todo mas claro, gracias por la ayuda Cesar, me ha servido de mucho, Disculpa las molestias! Un Saludo.