Elementary cellular automaton/Random number generator: Difference between revisions
Elementary cellular automaton/Random number generator (view source)
Revision as of 19:26, 12 January 2015
, 9 years ago→{{header|Racket}}
m (→{{header|Racket}}: stub added) |
|||
Line 224:
=={{header|Racket}}==
Implementation of [[Elementary cellular automaton]] is saved in "Elementary_cellular_automata.rkt"
<lang racket>▼
▲<lang racket>#lang racket
; below is the code from the parent task
(require "Elementary_cellular_automata.rkt")
(require racket/fixnum)
;; This is the RNG automaton
(define ng/30 (CA-next-generation 30))
(define (random-usable-bits) (random (fxlshift 1 usable-bits/fixnum-1)))
(define CA30-rand
(let ((v ; seed CA state -- I'd expect the period of a wider automaton to be larger
; maybe even as high as 2^(30*4) -- who knows?
(fxvector (random-usable-bits) (random-usable-bits) (random-usable-bits) (random-usable-bits))))
(define (next-word)
(define-values (v+ o) (ng/30 v 0))
(set! v v+)
(fxvector-ref v 0))
;; make sure all bits have affected each other
(for ((i (* usable-bits/fixnum-1 (fxvector-length v)))) (next-word))
(lambda (bits)
(for/fold ((acc 0))
((_ (in-range bits)))
;; the CA is fixnum, but this function returns integers of arbitrary width
(bitwise-ior (arithmetic-shift acc 1) (bitwise-and (next-word) 1))))))
(module+ main
(CA30-rand 32)
(CA30-rand 32)
(CA30-rand 32)
(CA30-rand 32)
; we also do big numbers...
(number->string (CA30-rand 256) 16)
(number->string (CA30-rand 256) 16)
(number->string (CA30-rand 256) 16)
(number->string (CA30-rand 256) 16))</lang>
{{out}}
<pre>2849574621
1863474554
2735907428
1999558413
"790cffff341e073a195bec90d411437b80ede7be3953765b3059c158eb12bbc5"
"c014dc24b52f5c7e305dd2b4e7b753af1107b88f8055dd1c3cdb81f806e62fb2"
"414ff56f551747b740e7fb4d0613cd9d645db546e783cbf77d026724e1e8ee5"
"9a3224043946601f7181c1a6efdeed5fb45f8deb76c339bfff73ad281160bc7d"</pre>
Random. Obviously <code>:-)</code>
=={{header|Ruby}}==
|