## Two More Random Exercises

### August 21, 2012

We calculate the next item in a middle-square sequence by computing quotients and remainders to appropriate powers of ten:

`(define (middle-square n)`

(let* ((len (+ (ilog 10 n) 1)) (len2 (quotient len 2)))

(modulo (quotient (* n n) (expt 10 len2)) (expt 10 len))))

Here’s an example:

`> (let loop ((n 675248) (k 25))`

(when (positive? k)

(display n) (newline)

(loop (middle-square n) (- k 1))))

675248

959861

333139

981593

524817

432883

387691

304311

605184

247673

341914

905183

356263

923325

529055

899193

548051

359898

526570

275964

156129

376264

574597

161712

150770

RANDU is a simple multiplication and modulus:

`(define (randu n) (modulo (* 65539 n) (expt 2 31)))`

Here’s an example:

`> (let loop ((n 1) (k 25))`

(when (positive? k)

(display n) (newline)

(loop (randu n) (- k 1))))

1

65539

393225

1769499

7077969

26542323

95552217

334432395

1146624417

1722371299

14608041

1766175739

1875647473

1800754131

366148473

1022489195

692115265

1392739779

2127401289

229749723

1559239569

845238963

1775695897

899541067

153401569

We used `ilog`

from the Standard Prelude. You can run the program at http://programmingpraxis.codepad.org/sNh3CRcZ.

Pages: 1 2

[...] Pages: 1 2 [...]

Needs -std=c++0x if compiling with g++.

I went ahead and coded up both of them in Scheme. This is the sort of thing where a language that has functions as first class citizens can really shine. You can write a function that generates a function that generates random numbers!

[...] Praxis put out another two “random” exercises, this time about making psuedorandom number generators (where the previous had us composing already [...]

A Python solution: