Skip to content

Commit 1ef4ad5

Browse files
authored
add fishman-moore pseudo random number generator (#177)
1 parent 29ae812 commit 1ef4ad5

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
"
2+
I am a simple implementation of Fishman-Moore pseudo-random number generator.
3+
4+
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
5+
"
6+
Class {
7+
#name : #PMFishmanMooreRandomGenerator,
8+
#superclass : #PMPseudoRandomNumberGenerator,
9+
#category : #'Math-Random'
10+
}
11+
12+
{ #category : #initialization }
13+
PMFishmanMooreRandomGenerator >> initialize [
14+
super initialize.
15+
seed := Time millisecondClockValue
16+
]
17+
18+
{ #category : #accessing }
19+
PMFishmanMooreRandomGenerator >> next [
20+
^ (seed := 742938285 * seed \\ 2147483647) / 2147483647.0
21+
]
22+
23+
{ #category : #accessing }
24+
PMFishmanMooreRandomGenerator >> nextInt: anInteger [
25+
^ (self next * anInteger) truncated + 1
26+
]
27+
28+
{ #category : #accessing }
29+
PMFishmanMooreRandomGenerator >> peek [
30+
^ 742938285 * seed \\ 2147483647 / 2147483647.0
31+
]
32+
33+
{ #category : #accessing }
34+
PMFishmanMooreRandomGenerator >> seed [
35+
^ seed
36+
]
37+
38+
{ #category : #accessing }
39+
PMFishmanMooreRandomGenerator >> seed: anInteger [
40+
seed := anInteger asInteger
41+
]
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Class {
2+
#name : #PMFishmanMooreRandomGeneratorTest,
3+
#superclass : #TestCase,
4+
#category : #'Math-Tests-Random'
5+
}
6+
7+
{ #category : #tests }
8+
PMFishmanMooreRandomGeneratorTest >> testNext [
9+
| random expectedNumbers |
10+
random := PMFishmanMooreRandomGenerator new.
11+
random seed: 2147483646.
12+
expectedNumbers := #(0.6540424017 0.2032902977 0.1634123433 0.0948051145 0.1617738056 0.6769099178 0.4410270808 0.0819611824 0.3259203002 0.9101976547).
13+
(1 to: expectedNumbers size)
14+
with: expectedNumbers
15+
do: [ :i :expected | self assert: random next closeTo: expected ]
16+
]

0 commit comments

Comments
 (0)