| 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 | /// @{ |