lemon/random.h
changeset 1169 2e0c2c25d63e
parent 1139 d51126dc39fa
child 1171 61fdd06833a6
equal deleted inserted replaced
28:fb0415a0a3e5 29:9d55bbb37dcb
    60  */
    60  */
    61 
    61 
    62 #ifndef LEMON_RANDOM_H
    62 #ifndef LEMON_RANDOM_H
    63 #define LEMON_RANDOM_H
    63 #define LEMON_RANDOM_H
    64 
    64 
       
    65 #include <lemon/config.h>
       
    66 
    65 #include <algorithm>
    67 #include <algorithm>
    66 #include <iterator>
    68 #include <iterator>
    67 #include <vector>
    69 #include <vector>
    68 #include <limits>
    70 #include <limits>
    69 #include <fstream>
    71 #include <fstream>
    70 
    72 
    71 #include <lemon/math.h>
    73 #include <lemon/math.h>
    72 #include <lemon/dim2.h>
    74 #include <lemon/dim2.h>
    73 
    75 
    74 #ifndef WIN32
    76 #ifndef LEMON_WIN32
    75 #include <sys/time.h>
    77 #include <sys/time.h>
    76 #include <ctime>
    78 #include <ctime>
    77 #include <sys/types.h>
    79 #include <sys/types.h>
    78 #include <unistd.h>
    80 #include <unistd.h>
    79 #else
    81 #else
   603     /// By default, this function calls the \c seedFromFile() member
   605     /// By default, this function calls the \c seedFromFile() member
   604     /// function with the <tt>/dev/urandom</tt> file. If it does not success,
   606     /// function with the <tt>/dev/urandom</tt> file. If it does not success,
   605     /// it uses the \c seedFromTime().
   607     /// it uses the \c seedFromTime().
   606     /// \return Currently always \c true.
   608     /// \return Currently always \c true.
   607     bool seed() {
   609     bool seed() {
   608 #ifndef WIN32
   610 #ifndef LEMON_WIN32
   609       if (seedFromFile("/dev/urandom", 0)) return true;
   611       if (seedFromFile("/dev/urandom", 0)) return true;
   610 #endif
   612 #endif
   611       if (seedFromTime()) return true;
   613       if (seedFromTime()) return true;
   612       return false;
   614       return false;
   613     }
   615     }
   623     /// block the input, but it could give back bytes with worse
   625     /// block the input, but it could give back bytes with worse
   624     /// entropy).
   626     /// entropy).
   625     /// \param file The source file
   627     /// \param file The source file
   626     /// \param offset The offset, from the file read.
   628     /// \param offset The offset, from the file read.
   627     /// \return \c true when the seeding successes.
   629     /// \return \c true when the seeding successes.
   628 #ifndef WIN32
   630 #ifndef LEMON_WIN32
   629     bool seedFromFile(const std::string& file = "/dev/urandom", int offset = 0)
   631     bool seedFromFile(const std::string& file = "/dev/urandom", int offset = 0)
   630 #else
   632 #else
   631     bool seedFromFile(const std::string& file = "", int offset = 0)
   633     bool seedFromFile(const std::string& file = "", int offset = 0)
   632 #endif
   634 #endif
   633     {
   635     {
   645     /// Seding from process id and time. This function uses the
   647     /// Seding from process id and time. This function uses the
   646     /// current process id and the current time for initialize the
   648     /// current process id and the current time for initialize the
   647     /// random sequence.
   649     /// random sequence.
   648     /// \return Currently always \c true.
   650     /// \return Currently always \c true.
   649     bool seedFromTime() {
   651     bool seedFromTime() {
   650 #ifndef WIN32
   652 #ifndef LEMON_WIN32
   651       timeval tv;
   653       timeval tv;
   652       gettimeofday(&tv, 0);
   654       gettimeofday(&tv, 0);
   653       seed(getpid() + tv.tv_sec + tv.tv_usec);
   655       seed(getpid() + tv.tv_sec + tv.tv_usec);
   654 #else
   656 #else
   655       seed(bits::getWinRndSeed());
   657       seed(bits::getWinRndSeed());