initial checkin
authorClaus Gittinger <cg@exept.de>
Sun, 04 Oct 2009 22:05:58 +0200
changeset 2290 5c14b7344d5c
parent 2289 57de37a4eb31
child 2291 0c557245d0bf
initial checkin
RandomLaggedFibonacci.st
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RandomLaggedFibonacci.st	Sun Oct 04 22:05:58 2009 +0200
@@ -0,0 +1,129 @@
+"{ Package: 'stx:libbasic2' }"
+
+Random subclass:#RandomLaggedFibonacci
+	instanceVariableNames:'values drift'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Magnitude-Numbers'
+!
+
+!RandomLaggedFibonacci class methodsFor:'documentation'!
+
+documentation
+"
+    The lagged Fibonacci additive generator is described in 
+    TAOCP vol. 2 by Donald Knuth, with lags 83 and 258.
+"
+! !
+
+!RandomLaggedFibonacci methodsFor:'accessing'!
+
+drift
+    ^ drift
+!
+
+drift:something
+    drift := something.
+!
+
+next
+    | answer |
+
+    answer := self nextValue.
+    self increaseDrift.
+    self values at: self drift put: answer.
+    ^ answer
+!
+
+nextValue
+    | answer |
+
+    answer := self smallLagValue - self largeLagValue.
+    answer < 0.0 ifTrue: [answer := answer + 1.0].
+    ^ answer
+!
+
+setSeed: aNumber
+    super setSeed: aNumber.
+    self initializeValues
+!
+
+values
+    ^ values
+!
+
+values:something
+    values := something.
+! !
+
+!RandomLaggedFibonacci methodsFor:'initialization'!
+
+initialize
+    super initialize.
+    self drift: 1.
+    self setSeed: (OperatingSystem getMicrosecondTime).
+    self initializeValueStorage.
+    self initializeValues
+!
+
+initializeValueStorage
+    |newValues|
+
+    newValues := Array new:self largeLag.
+    self values:newValues
+!
+
+initializeValues
+    |random|
+
+    random := RandomParkMiller new.
+    random seed:self seed.
+    1 to:self values size do:[:eachIndex | 
+        self values at:eachIndex put:random next
+    ]
+! !
+
+!RandomLaggedFibonacci methodsFor:'private'!
+
+increaseDrift
+    |newDrift|
+
+    newDrift := self drift = self largeLag 
+                    ifTrue:[1] 
+                    ifFalse:[self drift + 1].
+    self drift:newDrift
+!
+
+indexForLag: aLag
+    | answer |
+
+    answer := self drift - aLag.
+    ^ answer > 0
+        ifTrue: [answer]
+        ifFalse: [answer + self largeLag]
+!
+
+largeLag
+    ^ 258
+!
+
+largeLagValue
+    ^ self values at: self drift
+!
+
+smallLag
+    ^ 83
+!
+
+smallLagValue
+    | index |
+
+    index := self indexForLag: self smallLag.
+    ^ self values at: index
+! !
+
+!RandomLaggedFibonacci class methodsFor:'documentation'!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/libbasic2/RandomLaggedFibonacci.st,v 1.1 2009-10-04 20:05:58 cg Exp $'
+! !