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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  función random
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: función random  (Leído 5,010 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
función random
« en: 5 Noviembre 2012, 19:35 pm »

Saludos

Tengo una duda con respecto a la función random

Si quisiera generar numeros aleatorios del 0 al 10 por ejemplo, sería algo como
rand()%11; pero que pasa cuando de esos números del 0 al 10 no quiero que se generen el 6 y el 4, por ejemplo.

¿Cómo podría hacer una excepción de algunos números?

de antemano gracias


En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: función random
« Respuesta #1 en: 5 Noviembre 2012, 19:39 pm »

puedes poner algo como
Código
  1. if ((x==4)||(x==6)) {
  2. } else {
  3. }

y de ese modo puedes excluir de tu código el 6 y el 4


En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: función random
« Respuesta #2 en: 5 Noviembre 2012, 20:22 pm »

Mi código es el siguiente, lo que me pide es generar cinco operaciones con los signos (+,-,*,/) aleatoriamente, para eso estoy utilizando los números ASCII:

42 = *
43 = +
44 = ,
45 = -
46 = .
47 = /

el único problema son el 44 y el 46

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define OPERACIONES 5
  5.  
  6. int main()
  7. {
  8.    int i,numero1,numero2,resultado;
  9.    char operacion;
  10.    srand(time(NULL));
  11.    for(i=0;i<OPERACIONES;i++)
  12.    {
  13.        numero1 = rand()%11;
  14.        numero2 = rand()%11;
  15.        operacion = rand()% 6+42;
  16.        if((operacion==44)||(operacion==46))
  17.        printf("%d %c %d = ",numero1,operacion,numero2);
  18.        scanf("%d",&resultado);
  19.    }
  20.    return 0;
  21. }
  22.  
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: función random
« Respuesta #3 en: 5 Noviembre 2012, 21:38 pm »

Citar
Tal como tienes planteado el if sólo sería cierto en los dos casos en que debe ser falso. Además hay que tener en cuenta si el aleatorio genera un valor no válido, lo que está contemplado en el "else" y para que lo veas he puesto "OTRO", que puedes quitar una vez entiendas como funciona:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define OPERACIONES 5
  5.  
  6. int main()
  7. {
  8.    int i,numero1,numero2,resultado;
  9.    char operacion;
  10.    srand(time(0));
  11.    for(i=0;i<OPERACIONES;i++)
  12.    {
  13.        numero1 = rand()%11;
  14.        numero2 = rand()%11;
  15.        operacion = rand()% 6+42;
  16.  
  17.        if(operacion==42 || operacion==43  || operacion==45 || operacion==47)
  18.            {
  19.                printf("%d %c %d = ",numero1,operacion,numero2);
  20.                scanf("%d",&resultado);
  21.            }
  22.        else
  23.            {
  24.                i--;puts ("Otro");continue;
  25.            }
  26.    }
  27.    return 0;
  28. }
Saludos!.
En línea

m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: función random
« Respuesta #4 en: 6 Noviembre 2012, 00:45 am »

Saludos leosansan

una última pregunta en el else de tu código pusiste i-- ¿por qué? no entiendo para qué pusiste ese contador

gracias por tu ayuda
En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: función random
« Respuesta #5 en: 6 Noviembre 2012, 16:23 pm »

una última pregunta en el else de tu código pusiste i-- ¿por qué? no entiendo para qué pusiste ese contador
Citar
Si resulta un valor no válido -si entra en el else- habrá que descontarlo, de ahí el i--, si no tendrías menos de cinco valores, ya que se contarían también los valores no válidos
Saludos!.
« Última modificación: 6 Noviembre 2012, 16:25 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: función random
« Respuesta #6 en: 6 Noviembre 2012, 17:49 pm »

Si resulta un valor no válido -si entra en el else- habrá que descontarlo, de ahí el i--, si no tendrías menos de cinco valores, ya que se contarían también los valores no válidos
En tu programa el uso de la sentencia "continue;" no es necesario ya que, si revisas con cuidado, es la ultima sentencia del bucle.

Y los dos cambios al contador se pueden reducir a uno si se utiliza un bucle "while" o "do ... while", por ejemplo:
Código
  1. i = 0;
  2. do {
  3.   numero1 = rand() % 11;
  4.   numero2 = rand() % 11;
  5.   operacion = rand() % 6 + 42;
  6.  
  7.   if (operacion == 44 || operacion == 46)
  8.      puts("Otro");
  9.   else {
  10.      printf("%d %c %d = ", numero1, operacion, numero2);
  11.      scanf("%d", &resultado);
  12.      i++;
  13.   }
  14. }while (i < OPERACIONES);

El problema de fondo (ignorar valores no deseados) se puede evitar simplemente almacenando los operadores en un array, la función "rand" se utiliza para generar el indice del operador a utilizar:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. #define OPERACIONES 5
  6.  
  7. int main()
  8. {
  9.   char opers[] = {'+', '-', '*', '/'};
  10.   size_t num_opers = sizeof opers;
  11.   size_t i;
  12.   int a;
  13.   int b;
  14.   int resultado;
  15.   char operacion;
  16.  
  17.   srand((unsigned) time(NULL));
  18.  
  19.   for (i = 0; i < OPERACIONES; i++){
  20.      a = rand() % 11;
  21.      b = rand() % 11;
  22.      operacion = opers[rand() % num_opers];
  23.  
  24.      printf("%d %c %d = ", a, operacion, b);
  25.      scanf("%d", &resultado);
  26.   }
  27.  
  28.   return 0;
  29. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: función random
« Respuesta #7 en: 6 Noviembre 2012, 20:18 pm »

En tu programa el uso de la sentencia "continue;" no es necesario ya que, si revisas con cuidado, es la ultima sentencia del bucle.
Pardillo, que soy un pardillo.....

Citar
Y los dos cambios al contador se pueden reducir a uno si se utiliza un bucle "while" o "do ... while"
Eso ya es lo clásico de un for o un while o do while, pero se agradece la observación.

Citar
Código
  1.   size_t num_opers = sizeof opers;
  2.   size_t i;
Me asalta la duda, tonta supongo: ¿por qué usar size_t en lugar de int?.
Saludos!.
En línea

BatchianoISpyxolo

Desconectado Desconectado

Mensajes: 166


Ver Perfil
Re: función random
« Respuesta #8 en: 6 Noviembre 2012, 21:39 pm »

Pues aquí un código para generar un vector de números aleatorios en un rango:

Código
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <sys/time.h>
  4. #define TAM 10
  5.  
  6. void inicializar_semilla() {
  7. srand(time(NULL));
  8. }
  9.  
  10. /* genera un vector de tamaño n con números de -10 a 10 */
  11. void aleatorio_mod10(int v[], int n) {
  12. int i;
  13. inicializar_semilla();
  14. for (i=0; i < n; i++)
  15. v[i] = (rand() % 21) - 10;
  16. }
  17.  
  18. int main () {
  19.    int vector[TAM], i;
  20.    aleatorio_mod10(vector, TAM);
  21.    for (i=0; i<TAM; i++)
  22. printf("%d ", vector[i]);
  23.    printf("\n");
  24. }
  25.  

rand() % x: genera un número aleatorio entre 0 y x-1

En mi caso: rand() % 21: genera números entre 0 y 20.

Si a ese resultado le resto 10, pues genero números en el rango [-10,10] en Z
En línea

Puede que desees aprender a programar desde 0: www.espascal.es
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: función random
« Respuesta #9 en: 7 Noviembre 2012, 18:27 pm »

¿por qué usar size_t en lugar de int?
Primero porque ese es el tipo de la expresión "sizeof opers" y segundo porque algunos compiladores, al utilizarse en su modo mas estricto, se quejan de operaciones entre tipos con signo (el tipo "int") y sin el (el tipo "size_t").

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Funcion Random entre 2 cosas
Programación Visual Basic
renga73 3 1,978 Último mensaje 10 Abril 2008, 05:41 am
por renga73
[Perl] Funcion rand (Random:Numero & Caracteres Aleatoreos)
Scripting
OzX 1 12,432 Último mensaje 19 Febrero 2009, 05:17 am
por Spora
Ayuda con la funcion random
Programación C/C++
m0y8_s70n3 1 1,938 Último mensaje 19 Noviembre 2010, 06:20 am
por do-while
Ayuda en con funcion random()
Programación C/C++
m0y8_s70n3 2 2,513 Último mensaje 20 Noviembre 2010, 06:44 am
por do-while
cual es la funcion de Random() y Clrscr...
Programación C/C++
Schiffer04 5 3,886 Último mensaje 14 Mayo 2012, 15:39 pm
por Ferno
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines