Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: K-YreX en 25 Noviembre 2018, 07:33 am



Título: Duda cstdlib y srand (C++)
Publicado por: K-YreX 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.


Título: Re: Duda cstdlib y srand (C++)
Publicado por: AlbertoBSD 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