新千葉 ガーベージ・コレクション

FPGA マガジンやインターフェースで書けなかったこと等をちょぼちょぼ書いてます。@ryos36

xorshift

Google Chromeが採用した、擬似乱数生成アルゴリズム「xorshift」の数理 – びりあるの研究ノート

開発中のプログラムで動くように書いてみた。長ったらしいのは xor を持っていないから。そもそも、ビット幅が特定できない、、、print もないしなぁ、、、

((:let ((y (:heap 19201738)))
   (:fix ((clear-bit0 (x)
            (:<< (:>> x 1) 1))

          (get-bit0 (x)
            (:- x (clear-bit0 x)))

          (xor-bit (b0 b1)
            (:if (:= b0 b1) 0 1))

          (xor0 (bit-n n x0 x1 rv)
            (:if (:= 0 bit-n) rv
                (:let ((x0-bit0 (get-bit0 x0))
                       (x1-bit0 (get-bit0 x1)))
                  (xor0
                    (:- bit-n 1)
                    (:+ n 1)
                    (:>> x0 1)
                    (:>> x1 1)
                    (:+ rv (:<< (xor-bit x0-bit0 x1-bit0) n))))))

          (xor (bit-n x0 x1)
             (xor0 bit-n 0 x0 x1 0))

          (rand ()
            (:let ((y0 (:record-ref y 0)))
              (:let ((y1 (xor 32 y0 (:<< y0 13))))
                (:let ((y2 (xor 32 y1 (:>> y1 17))))
                  (:let ((y3 (xor 32 y2 (:<< y2 15))))
                    (:record-set! y3 0 y)
                    y3))))))

         (rand)
         (rand)
         (rand)
         (:exit (rand)))))