RandomParkMiller.st
author Claus Gittinger <cg@exept.de>
Sat, 17 Nov 2001 12:08:36 +0100
changeset 998 5f66a2dd6b7d
parent 977 a7e2a422bfdb
child 2073 7cb0248742e3
permissions -rw-r--r--
documentation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
977
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
Object subclass:#RandomParkMiller
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'seed'
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:'PMa PMm PMmu1 PMq PMr'
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Magnitude-Numbers'
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!RandomParkMiller class methodsFor:'documentation'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    NO WARRANTY
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Another pseudo-random number generator
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
998
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    18
    Please read:
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    19
        Standard reference by Park and Miller in 
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    20
            'Random Number Generators: Good Ones Are Hard to Find',
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    21
        Comm. ACM, 31:1192-1201, 1988.
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    22
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    23
    [see also:]
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    24
        Random  - fast, but generates less quality random numbers
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    25
        RandomTT800 - another random generator
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    26
"
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    27
!
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    28
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    29
testing
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    30
"
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
    31
977
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
    |r|
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
    r := self new.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
    (1 to:10) collect:[:i | r next]
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
    -> should be
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
        #(
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
            0.1492432697 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
            0.3316330217 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
            0.7561964480 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
            0.3937015400 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
            0.9417831814 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
            0.5499291939 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
            0.6599625962 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
            0.9913545591 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
            0.6960744326 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
            0.9229878997
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
        #)
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
"
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
!RandomParkMiller class methodsFor:'initialization'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
initialize
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
    PMa := 16807.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    PMm := 2147483647.    " magic constant = 16807 "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    PMq := 127773.        " magic constant = 2147483647 "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    PMr := 2836.          " quotient (m quo: a) = 44488 "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    PMmu1 := 4.65661E-10  " remainder (m \\ a). = 2836 "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
!RandomParkMiller class methodsFor:'instance creation'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
new
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    self initialize.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    ^ super new initialize
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
!RandomParkMiller methodsFor:'accessing-reading'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
next
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
    " This method generates random instances of Float in the interval 0.0 to 1.0 "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    seed := self nextInteger.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
    ^ seed * PMmu1
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
nextInteger
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    " This method generates random instances of Integer in the interval 0 to 16r7FFFFFFF. "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    seed := self peekInteger.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    ^ seed
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
!RandomParkMiller methodsFor:'initialization'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
initialize
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    " Set a reasonable Park-Miller starting seed "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    seed := 2345678901
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
seed:anInteger 
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    seed := anInteger
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
!RandomParkMiller methodsFor:'private'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
peek
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    " This method answers the next random number that will be generated as a Float in the range [0..1). It answers the same value for all successive message sends. "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
    ^ self peekInteger * PMmu1
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
peekInteger
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
    " This method generates random instances of Integer in the interval 0 to 16r7FFFFFFF. This method does NOT update the seed; repeated sends answer the same value. The algorithm is described in detail in 'Random Number Generators: Good Ones Are Hard to Find' by Stephen K. Park and Keith W. Miller, (Comm. Asso. Comp. Mach., 31(10):1192--1201, 1988). "
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
    |lo hi aLoRHi answer|
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
    hi := seed quo:PMq.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
    lo := seed rem:PMq.
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
    aLoRHi := (PMa * lo) - (PMr * hi).
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
    (aLoRHi > 0) ifTrue:[ ^ aLoRHi ].
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
    ^ aLoRHi + PMm
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
!RandomParkMiller class methodsFor:'documentation'!
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
version
998
5f66a2dd6b7d documentation
Claus Gittinger <cg@exept.de>
parents: 977
diff changeset
   121
    ^ '$Header: /cvs/stx/stx/libbasic2/RandomParkMiller.st,v 1.2 2001-11-17 11:08:33 cg Exp $'
977
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
! !
a7e2a422bfdb initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
RandomParkMiller initialize!