Ayuda en codigo que genera aleatorio

Iniciado por cacara, 6 Enero 2012, 05:36 AM

0 Miembros y 1 Visitante están viendo este tema.

cacara

El problema es que necesito generar 3 numeros aleatorios a la vez para que salgan los tres juntos y al esta srand() definido por la hora del ordenador, salen iguales, alguien sabe que mas valores puede tomar srand() aparte de srand(time(NULL)) para que salieran aleatorios casi puros?
El codigo de la funcion que manda aleatorio es este:
Código (cpp) [Seleccionar]
int aleatorio()
{
    int num;
    srand (time(NULL));
    num = rand()%10;
    return num;
}


Y el programa que utiliza dicha funcion es este:
Código (cpp) [Seleccionar]
facil1 = aleatorio(); facil2 = aleatorio(); facil3 = aleatorio();
     cout << "El numero pensado es: ";
     cout << facil1 << facil2 << facil3;


Lo que necesito es que cada variable facil1, facil2 y facil3, guarden un valor aleatorio distinto para mostrar luego en pantalla los tres juntos como si fuera un numero de 3 cifras, que generar uno aleatorio de 3 cifras no me vale.
Muchas Gracias De Antemano!!!

KaL3o

#1
Otra vez te recomiendo googlea un poco antes de preguntar, eso es muy facil de encontrar en cualquier buscador

pon esta linea
srand((unsigned)time(NULL));


Código (cpp) [Seleccionar]

int aleatorio()
{
   int num;
   num = rand()%10;
   return num;
}

int main()
{
   int facil1,facil2,facil3;
   srand((unsigned)time(NULL));
   facil1 = aleatorio();
   facil2 = aleatorio();
   facil3 = aleatorio();
   cout << "El numero pensado es: ";
   cout << facil1 << facil2 << facil3;
}


Espero te sirva
Salu2 :)
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.

cacara

#2
Ya he probado eso, es mas, eso lo probe antes de poner el que tenia ahora y sigue generando los 3 numeros iguales. Y si he buscado demasiado y la unica opcion que me sale es esa, en caso de no haber forma de generar un aleatorio casi puro, no se le pueden poner mas opciones dentro de srand en vez de time(NULL)??

KaL3o

Si lo hubieras probado te darias cuenta que el codigo SI genera los números aleatorios.

Una cosa es leer, observar, y probar... otra muy distinta es asumir que se te ha escrito lo que ya tenias.

Con respecto a tu pregunta la respuesta es si, si se puede poner otras opciones dentro de srand, Espero encuentres mas info en google, bing, blekko, yahoo, o algun buscador. Busca GetTickTime para windows o clock_gettime(CLOCK_MONOTONIC, &tp) en linux. Claro que hay algo que agregar en el header, pero la idea es que lo puedas investigar :D

Aunque una solucion a lo que buscas ya la tienes, relee lo ya expuesto y mira en que se diferencia de lo que ya tienes. Y lo de buscar alternativas me parece genial. Asi que animo!!!

Por ultimo te dejo este link http://lmgtfy.com/?q=srand+c%2B%2B
Una buena señal es que no pidio el codigo hecho

Salu2 :)
Todos los caminos se vuelven a juntar. Pero nunca de la misma forma.

cacara

#4
Ahh vale muchas gracias entonces es que ayer me pase buscando horas y lo unico que encontre era time(NULL) y getpid() y si observando bien el codigo si se diferencia del mio y funciona, y una cosita mas hay algo facil para hacer que ninguno de los numeros generados sean iguales? Porque aveces sale por ejemplo 778 o 655 porque lo unico que se me ocurre es poner sentencias IF comparando uno con el anterior y si es igual, que lo vuelva a generar.

Muchas gracias!!

cacara

Al final he hecho funcionar el getpid() solo me faltaba una libreria .h
Gracias!!

rir3760

Cita de: cacara en  6 Enero 2012, 15:58 PMuna cosita mas hay algo facil para hacer que ninguno de los numeros generados sean iguales? Porque aveces sale por ejemplo 778 o 655 porque lo unico que se me ocurre es poner sentencias IF comparando uno con el anterior y si es igual, que lo vuelva a generar.
En C estándar no hay forma de garantizar que los números no se repitan, eso debe hacerse de forma manual ya sea comparando con los ya generados (como comentas) o bien, si el rango de números es pequeño, almacenando estos en un array y seleccionando (generando el indice) de forma aleatoria.

Por ejemplo:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM_ELEM 16

int main(void)
{
   int num[NUM_ELEM];
   int i;
   int j;
   
   srand((unsigned) time(NULL));
   
   for (i = 0; i < NUM_ELEM; i++)
      num[i] = i;
   
   /* Seleccionar los numeros en orden aleatorio */
   for (i = NUM_ELEM; i > 0; i--){
      j = rand() % i;
      printf(" %2d", num[j]);
     
      num[j] = num[i - 1];
   }
   putchar('\n');
   
   return EXIT_SUCCESS;
}

Por supuesto ello no sirve si el rango de valores es significativo.

Un saludo
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

cacara

Ok muchisimas gracias, al final he optado por el getpid() que de momento con todas las pruebas que he hecho no me ha generado ninguno tipo 778 o 255 y si no creo que optare por poner las sentencias IF pero como ya he dicho de momento ningun problema, Gracas!!

SirLanceCC

Citaral final he optado por el getpid() que de momento con todas las pruebas que he hecho no me ha generado ninguno tipo 778 o 255

Eso no te garantiza para nada que en algún momento no te vaya a salir uno de esos números repetidos.
[tecnicismo] De hecho en una distribución aleatoria uniforme los números se pueden repetir por que cada número tiene siempre la misma probabilidad de salir. [/tecnicismo]
Una posible solución es la siguiente:

Tener un arreglo de dígitos (no importa el orden, así que lo más fácil es generarlos en orden). Escoger un dígito válido (los que están en corchetes).

     v
[0123456789]

Intercambiar el digito escogido con el último del rango. Reducir el rango de dígitos válidos. Escoger otro número.

   v
[012395678]4

Intercambiar el digito escogido con el último del rango. Reducir el rango de dígitos válidos. Escoger otro número.

       v
[01839567]24

El número generado es 426.

Naturalmente escogemos un dígito del arreglo con rand().