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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda cstdlib y srand (C++)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda cstdlib y srand (C++)  (Leído 1,657 veces)
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Duda cstdlib y srand (C++)
« en: 25 Noviembre 2018, 07:33 am »

Esto puede parecer una tontería ya que no tiene mucha complicación usar la librería de C++ <cstdlib> y las funciones <srand> y <rand> para generar números aleatorios. Pero qué pasa si no usas <cstdlib> o usas la función <time()> sin incluir <ctime>?? :huh:
Estaba haciendo un programa en el que iba a generar unos números aleatorios pero se me ha olvidado incluir tanto la librería <cstdlib> como la función <srand> es decir que únicamente he usado la función <rand> sin más... Y el programa ha funcionado. :o
Me he puesto a hacer pruebas y os dejo los resultados (compilado desde Ubuntu 18.04 con g++ <programa.cpp> -o <programa>):
Código
  1. #include <iostream>
  2. #include <list>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7. const int MAX_ELEMENTS = 10;
  8. const int LIMIT_INF = 0, LIMIT_SUP = 5;
  9.  
  10. list<int> myList;
  11.  
  12. for(size_t i = 0; i < MAX_ELEMENTS; i++)
  13. myList.push_back(LIMIT_INF + rand() % (LIMIT_SUP - LIMIT_INF + 1));
  14.  
  15. for(auto it = myList.cbegin(); it != myList.cend(); it++)
  16. cout << *it << "  ";
  17. cout << endl;
  18. }

Con este código compila el programa sin errores ni warnings pero sí es cierto que los números son siempre los mismos (lógico por no usar srand).

Entonces he probado a incluir la semilla sin nada más, es decir, como se ve aquí:
Código
  1. #include <iostream>
  2. #include <list>
  3.  
  4. using namespace std;
  5.  
  6. int main(){
  7. const int MAX_ELEMENTS = 10;
  8. const int LIMIT_INF = 0, LIMIT_SUP = 5;
  9.  
  10. list<int> myList;
  11.  
  12. srand(time(NULL));
  13.  
  14. for(size_t i = 0; i < MAX_ELEMENTS; i++)
  15. myList.push_back(LIMIT_INF + rand() % (LIMIT_SUP - LIMIT_INF + 1));
  16.  
  17. for(auto it = myList.cbegin(); it != myList.cend(); it++)
  18. cout << *it << "  ";
  19. cout << endl;
  20. }
Y ahora tengo un programa que compila sin errores ni warnings y que genera los números aleatorios distintos cada vez que se ejecuta el programa (sin compilarlo antes de cada ejecución). ;-)
También si os dais cuenta tampoco he incluido <ctime> para usar la función <time()>. :silbar:
He estado investigando <iostream> por si incluía <cstdlib> pero no he encontrado nada. Lo de usar <list> es simplemente porque era lo que estaba usando cuando me he dado cuenta de esto y no he querido quitarlo por si tenía algo que ver con la respuesta aunque tampoco he encontrado nada al respecto.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Duda cstdlib y srand (C++)
« Respuesta #1 en: 25 Noviembre 2018, 08:11 am »

A mi me da error:

Código:
C:\codigos>g++ -o t.exe t.cpp
t.cpp: In function 'int main()':
t.cpp:12:21: error: 'time' was not declared in this scope
      srand(time(NULL));

C:\codigos>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/6.3.0/lto-wrapper.exe
Target: mingw32
Configured with: ../src/gcc-6.3.0/configure --build=x86_64-pc-linux-gnu --host=mingw32 --with-gmp=/mingw --with-mpfr=/mingw --with-mpc=/mingw --with-isl=/mingw --prefix=/mingw --disable-win32-registry --target=mingw32 --with-arch=i586 --enable-languages=c,c++,objc,obj-c++,fortran,ada --with-pkgversion='MinGW.org GCC-6.3.0-1' --enable-static --enable-shared --enable-threads --with-dwarf2 --disable-sjlj-exceptions --enable-version-specific-runtime-libs --with-libiconv-prefix=/mingw --with-libintl-prefix=/mingw --enable-libstdcxx-debug --with-tune=generic --enable-libgomp --disable-libvtv --enable-nls
Thread model: win32
gcc version 6.3.0 (MinGW.org GCC-6.3.0-1)

A de ser algo de tu compilador que la incluye, alguna vez me paso algo similar que sin incluir explícitamente en biblioteca de funciones, el compilador no marcaba errores y generaba el exe sin problemas.

Saludos


« Última modificación: 25 Noviembre 2018, 08:14 am por AlbertoBSD » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
¿Problema con srand()?
Programación C/C++
Marovingio 3 3,542 Último mensaje 15 Septiembre 2010, 05:51 am
por Littlehorse
programas con srand y rand
Programación C/C++
lokita_sarah 1 2,281 Último mensaje 1 Diciembre 2011, 04:28 am
por ralymontes
Srand para que den dos numeros diferentes? « 1 2 »
Programación C/C++
Anastacio 12 9,242 Último mensaje 19 Febrero 2012, 22:16 pm
por Anastacio
Como utilizar dos veces la funcionn srand(time(NULL))
Programación C/C++
BJM 3 7,279 Último mensaje 19 Enero 2013, 11:58 am
por Puntoinfinito
Problema con rand y srand en este codigo
Programación C/C++
pacosn1111 6 2,892 Último mensaje 26 Abril 2015, 20:09 pm
por Miky Gonzalez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines