]> git.localhorst.tv Git - blank.git/blobdiff - src/rand/GaloisLFSR.hpp
avoid library rand()
[blank.git] / src / rand / GaloisLFSR.hpp
index 88a1d37e899f1b26e369a727a804d7755ba7d33e..395ff8f0546cc7b75cf111a4b996a7705052f29b 100644 (file)
@@ -11,10 +11,21 @@ class GaloisLFSR {
 
 public:
        // seed should be non-zero
-       explicit GaloisLFSR(std::uint64_t seed) noexcept;
+       explicit GaloisLFSR(std::uint64_t seed) noexcept
+       : state(seed) { }
 
        // get the next bit
-       bool operator ()() noexcept;
+       bool operator ()() noexcept {
+               bool result = state & 1;
+               state >>= 1;
+               if (result) {
+                       state |= 0x8000000000000000;
+                       state ^= mask;
+               } else {
+                       state &= 0x7FFFFFFFFFFFFFFF;
+               }
+               return result;
+       }
 
        template<class T>
        T operator ()(T &out) noexcept {
@@ -27,12 +38,19 @@ public:
                return out = static_cast<T>(state);
        }
 
+       template<class T>
+       T Next() noexcept {
+               T next;
+               return (*this)(next);
+       }
+
 private:
        std::uint64_t state;
        // bits 64, 63, 61, and 60 set to 1 (counting from 1 lo to hi)
        static constexpr std::uint64_t mask = 0xD800000000000000;
 
 };
+
 }
 
 #endif