Autor
|
Tema: Problema en C - Numeros aleatorios sin que se repitan (Leído 3,967 veces)
|
Mattux
Desconectado
Mensajes: 4
|
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) for (i = 0; i < 90; i++) { int nros = rand() % 90+1; }
|
|
|
En línea
|
|
|
|
CalgaryCorpus
|
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
|
|
|
|
Mattux
Desconectado
Mensajes: 4
|
Como seria mas o menos el codigo?
|
|
|
En línea
|
|
|
|
K-YreX
|
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). 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.
|
|
|
En línea
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Mattux
Desconectado
Mensajes: 4
|
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
|
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
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
Mattux
Desconectado
Mensajes: 4
|
Lo intente pasar y me quedo así, pero me da un par de errores. int main() { int limiteGenerados, indiceAleatorio, numeroAleatorio; int numeros[90]; int numerosGenerados=0; while (numerosGenerados < limiteGenerados) { indiceAleatorio = generarAleatorio(0 + numerosGenerados, 89); //error en generarAleatorio (warning: implicit declaration of function ‘generarAleatorio’ [-Wimplicit-function-declaration]) numeroAleatorio = numeros[indiceAleatorio]; intercambiar(numeros[indiceAleatorio], numeros[numerosGenerados]); //error en intercambiar (warning: implicit declaration of function ‘intercambiar’ [-Wimplicit-function-declaration]) numerosGenerados = numerosGenerados + 1; } return 0; }
|
|
|
En línea
|
|
|
|
K-YreX
|
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
|
cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
|
|
|
CalgaryCorpus
|
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
|
|
|
|
Serapis
|
Es algo más sencillo sobretodo al final para usarlo... 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
codigo para que no se repitan los numeros aleatorios con un randomize
.NET (C#, VB.NET, ASP)
|
jan77
|
3
|
6,364
|
5 Febrero 2011, 11:49 am
por kingdarnakes
|
|
|
Generar números aleatorios sin que se repitan ... en C++
Programación C/C++
|
drawiz
|
4
|
28,045
|
17 Octubre 2019, 07:46 am
por Mecanma
|
|
|
problema con keygen y numeros aleatorios
Programación Visual Basic
|
BigByte
|
5
|
2,830
|
7 Marzo 2014, 07:48 am
por BigByte
|
|
|
[c] Problema numeros aleatorios mayores de 1000
Programación C/C++
|
dmacias
|
8
|
3,353
|
6 Abril 2014, 13:59 pm
por dmacias
|
|
|
Generar numeros aleatorios sin que se repitan
Programación C/C++
|
Mecanma
|
1
|
3,884
|
17 Octubre 2019, 06:28 am
por Serapis
|
|