RandomLaggedFibonacci.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 2290 5c14b7344d5c
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:

"{ 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 $'
! !