equal
deleted
inserted
replaced
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()); |