Elementary cellular automaton/Random number generator: Difference between revisions

m (→‎{{header|Racket}}: stub added)
Line 224:
=={{header|Racket}}==
 
Implementation of [[Elementary cellular automaton]] is saved in "Elementary_cellular_automata.rkt"
<lang racket>
 
</lang>
<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
</pre>
2735907428
1999558413
"790cffff341e073a195bec90d411437b80ede7be3953765b3059c158eb12bbc5"
"c014dc24b52f5c7e305dd2b4e7b753af1107b88f8055dd1c3cdb81f806e62fb2"
"414ff56f551747b740e7fb4d0613cd9d645db546e783cbf77d026724e1e8ee5"
"9a3224043946601f7181c1a6efdeed5fb45f8deb76c339bfff73ad281160bc7d"</pre>
 
Random. Obviously <code>:-)</code>
 
=={{header|Ruby}}==
569

edits