| | 610 | |
| | 611 | /// \brief Seeding from file or from process id and time |
| | 612 | /// |
| | 613 | /// By default, this function calls the \c seedFromFile() member |
| | 614 | /// function with the <tt>/dev/urandom</tt> file. If it is not success, |
| | 615 | /// it uses the \c seedFromTime(). |
| | 616 | /// \return Currently always true. |
| | 617 | bool seed() { |
| | 618 | #ifndef WIN32 |
| | 619 | if (seedFromFile("/dev/urandom", 0)) return true; |
| | 620 | #endif |
| | 621 | if (seedFromTime()) return true; |
| | 622 | return false; |
| | 623 | } |
| | 624 | |
| | 625 | /// \brief Seeding from file |
| | 626 | /// |
| | 627 | /// Seeding the random sequence from file. The linux kernel has two |
| | 628 | /// devices, <tt>/dev/random</tt> and <tt>/dev/urandom</tt> which |
| | 629 | /// could give good seed values for pseudo random generators (The |
| | 630 | /// difference between two devices is that the <tt>random</tt> may |
| | 631 | /// block the reading operation while the kernel can give good |
| | 632 | /// source of randomness, while the <tt>urandom</tt> does not |
| | 633 | /// block the input, but it could give back bytes with worse |
| | 634 | /// entropy). |
| | 635 | /// \param file The source file |
| | 636 | /// \param offset The offset, from the file read. |
| | 637 | /// \return True when the seeding is success. |
| | 638 | #ifndef WIN32 |
| | 639 | bool seedFromFile(const std::string& file = "/dev/urandom", int offset = 0) |
| | 640 | #else |
| | 641 | bool seedFromFile(const std::string& file = "", int offset = 0) |
| | 642 | #endif |
| | 643 | { |
| | 644 | std::ifstream rs(file.c_str()); |
| | 645 | const int size = 4; |
| | 646 | Word buf[size]; |
| | 647 | if (offset != 0 && !rs.seekg(offset)) return false; |
| | 648 | if (!rs.read(reinterpret_cast<char*>(buf), sizeof(buf))) return false; |
| | 649 | seed(buf, buf + size); |
| | 650 | return true; |
| | 651 | } |
| | 652 | |
| | 653 | /// \brief Seding from process id and time |
| | 654 | /// |
| | 655 | /// Seding from process id and time. This function uses the |
| | 656 | /// current process id and the current time for initialize the |
| | 657 | /// random sequence. |
| | 658 | /// \return Currently always true. |
| | 659 | bool seedFromTime() { |
| | 660 | #ifndef WIN32 |
| | 661 | timeval tv; |
| | 662 | gettimeofday(&tv, 0); |
| | 663 | seed(getpid() + tv.tv_sec + tv.tv_usec); |
| | 664 | #else |
| | 665 | FILETIME time; |
| | 666 | GetSystemTimeAsFileTime(&time); |
| | 667 | seed(GetCurrentProcessId() + time.dwHighDateTime + time.dwLowDateTime); |
| | 668 | #endif |
| | 669 | return true; |
| | 670 | } |
| | 671 | |
| | 672 | /// @} |
| | 673 | |
| | 674 | ///\name Uniform distributions |
| | 675 | /// |
| | 676 | /// @{ |