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