diff --git a/src/Math-Random/PMFishmanMooreRandomGenerator.class.st b/src/Math-Random/PMFishmanMooreRandomGenerator.class.st new file mode 100644 index 000000000..2f14eb55f --- /dev/null +++ b/src/Math-Random/PMFishmanMooreRandomGenerator.class.st @@ -0,0 +1,41 @@ +" +I am a simple implementation of Fishman-Moore pseudo-random number generator. + +Onghena, P. A theoretical and empirical comparison of mainframe, microcomputer, and pocket calculator pseudorandom number generators. Behavior Research Methods, Instruments, & Computers 25, 384–395 (1993). https://doi.org/10.3758/BF03204529 +" +Class { + #name : #PMFishmanMooreRandomGenerator, + #superclass : #PMPseudoRandomNumberGenerator, + #category : #'Math-Random' +} + +{ #category : #initialization } +PMFishmanMooreRandomGenerator >> initialize [ + super initialize. + seed := Time millisecondClockValue +] + +{ #category : #accessing } +PMFishmanMooreRandomGenerator >> next [ + ^ (seed := 742938285 * seed \\ 2147483647) / 2147483647.0 +] + +{ #category : #accessing } +PMFishmanMooreRandomGenerator >> nextInt: anInteger [ + ^ (self next * anInteger) truncated + 1 +] + +{ #category : #accessing } +PMFishmanMooreRandomGenerator >> peek [ + ^ 742938285 * seed \\ 2147483647 / 2147483647.0 +] + +{ #category : #accessing } +PMFishmanMooreRandomGenerator >> seed [ + ^ seed +] + +{ #category : #accessing } +PMFishmanMooreRandomGenerator >> seed: anInteger [ + seed := anInteger asInteger +] diff --git a/src/Math-Tests-Random/PMFishmanMooreRandomGeneratorTest.class.st b/src/Math-Tests-Random/PMFishmanMooreRandomGeneratorTest.class.st new file mode 100644 index 000000000..100862dee --- /dev/null +++ b/src/Math-Tests-Random/PMFishmanMooreRandomGeneratorTest.class.st @@ -0,0 +1,16 @@ +Class { + #name : #PMFishmanMooreRandomGeneratorTest, + #superclass : #TestCase, + #category : #'Math-Tests-Random' +} + +{ #category : #tests } +PMFishmanMooreRandomGeneratorTest >> testNext [ + | random expectedNumbers | + random := PMFishmanMooreRandomGenerator new. + random seed: 2147483646. + expectedNumbers := #(0.6540424017 0.2032902977 0.1634123433 0.0948051145 0.1617738056 0.6769099178 0.4410270808 0.0819611824 0.3259203002 0.9101976547). + (1 to: expectedNumbers size) + with: expectedNumbers + do: [ :i :expected | self assert: random next closeTo: expected ] +]