elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema en C - Numeros aleatorios sin que se repitan
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema en C - Numeros aleatorios sin que se repitan  (Leído 3,967 veces)
Mattux

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Problema en C - Numeros aleatorios sin que se repitan
« en: 9 Octubre 2019, 02:09 am »

Tengo que hacer un programa que muestre números aleatorios entre 1 y 90. El problema es que (por ej: sale un 4, y despues de mostrar 20 numeros, sale denuevo el 4)

Código
  1. srand(time(NULL));
  2.  for (i = 0; i < 90; i++)
  3. {
  4. int nros = rand() % 90+1;
  5. printf ("%d\n", nros);
  6. getch();
  7.  
  8. }


En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #1 en: 9 Octubre 2019, 05:18 am »

Una idea posible : usa un arreglo para recordar los numeros que ya salieron.
Otra idea: usa un arreglo para elegir desde alli los numeros.


En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Mattux

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #2 en: 9 Octubre 2019, 07:35 am »

Como seria mas o menos el codigo?
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #3 en: 9 Octubre 2019, 13:04 pm »

De las dos ideas que te han dado me gusta más la segunda así que te la explico un poco en pseudocódigo (esto es para que lo entiendas, no es C, cuando lo entiendas tú eres el que lo tiene que hacer en C y si tienes problemas poner el código para poder ayudarte).
Código:
numeros := {1,2,3,4,5,...,89,90} // el array de numeros
numerosGenerados := 0 // indica la cantidad de numeros que hemos generado
MIENTRAS numerosGenerados < limiteGenerados HACER // limiteGenerados seria la cantidad de numeros que queremos calcular
    indiceAleatorio := generarAleatorio(0 + numerosGenerados, 89)
    numeroAleatorio := numeros[indiceAleatorio]
    intercambiar(numeros[indiceAleatorio], numeros[numerosGenerados])
    numerosGenerados := numerosGenerados + 1
FIN MIENTRAS
La idea es sacar un índice aleatorio entre 0 y 89 (en la primera iteración) y ese índice servirá para sacar el número aleatorio. Ponemos el número que ya hemos sacado en la posición 0 y el de la posición 0 en la posición del índice aleatorio. Así en la segunda vuelta obtendremos un índice entre 1 y 89 y como el valor que hemos sacado antes está en la posición 0, no volverá a salir.
En resumen, vamos dejando los valores que ya han salido a la izquierda y cogemos valores nuevos sólo de la derecha.
Si lo entiendes, crea eso mismo pero en C. :-X
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Mattux

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #4 en: 10 Octubre 2019, 02:15 am »

YreX-DwX Lamentablemente no vi Pseudocodigo. Mire un par de tutoriales para entenderlo pero no le agarro el truco.
Si lo podrías pasar a C, te lo agradecería mucho.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #5 en: 10 Octubre 2019, 02:45 am »

Si lo paso a C, te lo estoy dando hecho. Simplemente tienes que leer ese fragmento de pseudocódigo y si entiendes lo que hace, intenta hacerlo en C aunque sea a tu manera. Lo bueno del pseudocódigo es precisamente que es fácil de entender sólo con leerlo.
Si hay alguna cosa que no entiendas, pregunta. También si empiezas a hacer el código y pones lo que llevas, puedo ayudarte mejor a completar lo que te falte.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Mattux

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #6 en: 10 Octubre 2019, 20:03 pm »

Lo intente pasar y me quedo así, pero me da un par de errores.
Código
  1. int main()
  2. {
  3.    int limiteGenerados, indiceAleatorio, numeroAleatorio;
  4.    int numeros[90];
  5.    int numerosGenerados=0;
  6.    while (numerosGenerados < limiteGenerados)
  7.    {
  8.        indiceAleatorio = generarAleatorio(0 + numerosGenerados, 89); //error en generarAleatorio (warning: implicit declaration of function ‘generarAleatorio’ [-Wimplicit-function-declaration])
  9.        numeroAleatorio = numeros[indiceAleatorio];
  10.        intercambiar(numeros[indiceAleatorio], numeros[numerosGenerados]); //error en intercambiar (warning: implicit declaration of function ‘intercambiar’ [-Wimplicit-function-declaration])
  11.        numerosGenerados = numerosGenerados + 1;
  12.    }
  13.    return 0;
  14. }
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #7 en: 10 Octubre 2019, 23:26 pm »

Lógicamente. generarAleatorio() e intercambiar() son "funciones" en pseudocódigo para que entiendas cuál es el proceso pero no existe ninguna función en C que se llame así...
Lo que tienes que hacer es implementar tú esa parte ya sea directamente en esa línea o crear una función y llamarla en esa línea.
Aparte de eso:
  • La variable limiteGenerados no tiene ningún valor por lo que no sabes cuántos números tienes que generar.
  • El array numeros[90] no tiene ningún valor.
Y tendrás que hacer algo con los números aleatorios supongo. Lo que yo te puse era el algoritmo que genera los números aleatorios, el resto del programa corre de tu cuenta.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #8 en: 11 Octubre 2019, 02:37 am »

El codigo queda mas simple si sacas desde el final que desde el principio del arreglo.

SI solo quieres imprimir los valores y no recordarlos, en vez de intercambiar puedes copiar desde el final a la posicion del elegido.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Problema en C - Numeros aleatorios sin que se repitan
« Respuesta #9 en: 11 Octubre 2019, 11:00 am »

Es algo más sencillo sobretodo al final para usarlo...

Código:
Array de enteros IntArray()
int sCantidad, Index

funcion GenerarArray(entero Cantidad)
    int k

    Si (Cantidad >0)
        sCantidad = cantidad
        dimensionar IntArray(0 a sCantidad-1)

        bucle para k desde 0 hasta sCantidad-1   
            IntArray(k) = k
        siguiente
 
        llamada a Barajar
    sino
        sCantidad = 0
    fin si
fin funcion

funcion Barajar
    int k, ix, tmp

    bucle para k desde sCantidad-1  hasta 1 retrocediendo
        ix = random(entre 0 y k)

        tmp = IntArray(ix)
        IntArray(ix) = IntArray(k)
        IntArray(k) = tmp
    siguiente

    Index = 0
fin funcion

int = Funcion GetValor
     int x
     x = IntArray(index)
     index += 1

     Si (index = cantidad) llamada a barajar
     devolver x
fin funcion

Y listo...
Al comienzo invocas la función generar con el valor que es la cantidad del array.
Tras generarse el array acto seguido se baraja...
Luego tu solo tienes que ir pidiendo 'GetValor', el programa se encarga de ir dandote cada valor seguido del array, y cuando alcance el final, se vuelve a barajar...

El array contiene exclusivamente una única copia de cada valor, luego no se repiten nunca, antes de usar el array creado siempre hay que 'barajarlo', igualmente cuando se extrae el último del array...

Así tu haría al comienzo:
    llamada a GenerarArray(90)
Y luego cuando precises un valor:
    int x = GetValor
y listo...
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines