4

me gustaria si me pudieran explicar bien cual es la diferencia, me confundo mucho con rand y srand, ¿cual es la diferencia? He buscado en otros sitios, pero confundo más. Gracias.

Sofía Videa
  • 53
  • 1
  • 1
  • 4

3 Answers3

7

Como seguramente habras leido la funcion rand() cada vez que la llamamos, nos devuelve un número entero pseudo-aleatorio entre 0 y el RAND_MAX (esta constante se encuentra definida en la librería ). Pero hay un inconviente, cada vez que llames a esta funcion dentro del programa, el te va a generar una secuencia, por ejemplo:

int main ()
{
   rand();//Supongamos que genera un 3
   rand();//Supongamos que genera un 12
   rand();//Supongamos que genera un 7
   return 0;
}

Pero si vuelves a ejecutar el programa, el te va a generar esa misma secuencia. Parte de un número inicial (llamado semilla), saca unas cuentas y saca un número aleatorio. Para el segundo número, echa unas cuentas con el resultado anterior y saca un segundo número y así sucesivamente.

Para evitar esto, es que se usa la función srand, para que la semilla sea diferente, y la secuencia resultante sea diferente cada vez que se ejecute el programa. Normalmente para que esta semilla sea diferente se usa la fecha, hora del sistema, usando la función time(), o también se usa el numero del proceso del programa que cambia cada vez que arranca el programa y se obtiene con la función getpid(). La función srand solo es necesario llamar una sola vez al principio del programa.

/**
Importar las librerias
**/
int main ()
{
   srand(time(NULL));//puedes usar esta
   srand(getpid());//o esta, pero llamas la función una vez
//En esta ocasión te dará secuencias diferentes cada vez que se ejecute el programa
   rand();
   rand();
   rand();
   return 0;
}

Ahora bien, como dato adicional, si en algún momento quieres cambiar la escala del numero resultante de rand() puede acudir al calculo del modulo, por ejemplo:

v1 = rand() % 100;         // v1 esta en el rango 0 to 99
v2 = rand() % 100 + 1;     // v2 esta en el rango 1 to 100
v3 = rand() % 30 + 1985;   // v3 esta en el rango 1985-2014

Espero haber resuelto tu duda.

Jose Melendez
  • 876
  • 5
  • 9
  • SE te agradece la ayuda pero preguntas tan amplias y que se basan en opiniones no se deben responder, te invito a leer [answer] en SO se espera que la pregunta muestre el código intentado para poder ayudar partiendo de una base clara, por favor ayudanos a mantener el nivel de preguntas y respuestas en SO –  Jul 22 '18 at 02:11
  • por que no esta acotada a una situación específica, convendría que se cheque el tipo de preguntas que la propia comunidad ha establecido sean posteadas; no lo digo yo lo he revisado como lo solicitado a lo largo de meses, pues esta pidiendo opiniones lo cual es motivo de cierre ya que las respuestas van a depender de cada usuario lo cual deriva en m+últiples opiniones –  Jul 22 '18 at 02:16
  • sería distinto si colocara un escenario mínimo donde lo ha ocupado, los resultados obtenidos y que pida explicación de la variación de resultados –  Jul 22 '18 at 02:18
  • 2
    @AlfredoPaz entiendo tu recomendación, como menciona el comentario anterior, la pregunta es bastante especifica, si bien no incluye código, lo que recomienda SO, es incluir el código, si el problema en cuestión es sobre código, pero este no es el caso. Tampoco es una opinión, porque existe una documentación clara de estas dos funciones de como deben ser usadas y en que contextos. Algunas de las inquietudes en las que los usuarios de SO han indicado como de mayor ayuda, son precisamente aquellas donde se aclaran conceptos tan sencillos, y que algunas veces la doc. oficial usa términos complejos – Jose Melendez Jul 22 '18 at 02:21
  • bueno miren yo solo sigo lo que marcan los motivos de cierre pero si estan seguros que me equivoco quitare el voto de cierre –  Jul 22 '18 at 02:22
  • @eyllanesc no tengo dudas es lo que he visto que ha sido motivo de cierre incluso por alguno de los moderadores y lo que entiendo por las reglas del sitio pero como les digo ya quite el voto de cierre asi que adelante a seguir –  Jul 22 '18 at 02:24
  • 2
    @AlfredoPaz por favor sigue el hilo de la pregunta que hice en meta: https://es.meta.stackoverflow.com/questions/3580/una-pregunta-que-pide-aclaracion-sobre-alguna-funci%C3%B3n-especifica-es-off-topic –  Jul 22 '18 at 02:34
  • Lo siento, en ningún momento pretendía causar problemas @JoseMelendez, me recomendaron SO ya que prácticamente no se nada de programación, me he graduado de algo completamente diferente. No era de mi conocimiento que no puedo hacer preguntas sin códigos. Pero, ¿si no entiendo qué significan las palabras reservadas o para qué se usan cómo crearé un código? Muchas gracias por tu información, me has ayudado mucho. – Sofía Videa Jul 23 '18 at 13:31
  • A la orden @SofíaVidea y tranquila, las discusiones en SO son sanas y ayudan a fortalecer la comunidad, los comentarios de los miembros siempre son con la mejor intencion y buscan lo mejor para la comunidad. Bienvenida y haz un recorrido por todo SO para que te mantengas informada – Jose Melendez Jul 23 '18 at 13:46
5

Podrías responder tu pregunta leyendo la documentación de las funciones que te causan dudas:

Por desgracia, la documentación está en inglés y puede que no domines el idioma. Por suerte, cppreference dispone de traducciones automáticas de contenido (std::rand en español std::srand en español) y más suerte aún ¡Existe StackOverflow en Español!.


std::rand

Devuelve un valor entero entre 0 y RAND_MAX (ambos incluidos) distribuyendo los valores de manera homogénea, esto significa que cualquier número dentro de dicho rango tiene las mismas probabilidades de ser escogido (1 probabilidad entre RAND_MAX).

Si std::rand() es llamada antes que cualquier llamada std::srand() se comportará como si la semilla hubiese establecido a 1. Cada vez que se asigna una semilla a srd::rand() con std::srand(), debe producir la misma secuencia de valores en llamadas sucesivas. Otras funciones en la librería estándar podrían llamar a std::rand().

std::srand

Establece la semilla que std::rand() usará para generar números pseudo-aleatorios.


No uses std::rand.

La función std::rand() pertenece a las librerías de C, dado que has etiquetado la pregunta como C++, no deberías utilizar utilidades de C ya que pueden no ser portables y pueden ofrecer resultados y rendimiento cuestionables. En concreto se está estudiando deprecar std::rand().

A partir del estándar C++11 el lenguaje C++ ofrece una completa librería de generación de números pseudoaleatorios que permite escoger la distribución de probabilidad (uniforme, Bernoulli, Poisson, normal, discreta, constante, lineal...), el tipo subyacente del valor generado e incluso el algoritmo a usar (minstd, mt19937, ranlux, knuth...).

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
3

Bien, intentaré resumir el concepto lo mejor que pueda:

srand: sirve para iniciar el generador de números aleatorios, creando una "semilla".

rand: simplemente te da un número aeatorio.

Prueba lo siguiente:

a) generar números aleatorios iniciando la "semilla" (srand) con un valor fijo, y veras que a cada ejecución de tu código obtendrás la misma lista de aleatorios. Ideal para poder repetir el mismo experimento. Es decir, que cada semilla generará una lista diferente de aleatorios (llamados pseudo-aleatorios) y la misma semilla te devolverá siempre la misma lista de valores aleatorios (pseudo-aleatorios).

b) iniciar srand con la hora actual de sistema (suele ser el valor que se usa como semilla). Así obtendrás una generación aleatoria diferente a ca da ejecución de tu código.