RandomKISS2.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 4594 041b61427188
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
4323
7caede8761de #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3418
diff changeset
     3
"{ NameSpace: Smalltalk }"
7caede8761de #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3418
diff changeset
     4
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
Object subclass:#RandomKISS2
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'x y z c'
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
4594
041b61427188 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4323
diff changeset
     9
	category:'Magnitude-Numbers-Random'
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!RandomKISS2 class methodsFor:'documentation'!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
documentation
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
"
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Warning: this generator should not be used for cryptographic work.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    NO WARRANTY
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
4323
7caede8761de #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3418
diff changeset
    20
    KISS combines a linear congruence, XorShift and Lag with carry generator.
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    The idea is from George Marsaglia.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
    KISS2 uses slightly different parameters and initial state.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    RandomKISS2 new nextInteger
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
    (RandomKISS2 new:5489) nextInteger
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    If heavily used, it may be useful to embed the original C code as inline C code for a big speedup)
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
    Please read:
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        http://www.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
    [see also:]
3400
f2570c0f6330 documentation link
Claus Gittinger <cg@exept.de>
parents: 3393
diff changeset
    33
        RandomGenerator - the default; uses the machine's /dev/random if available
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
        Random  - fast, but generates less quality random numbers
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
        RandomTT800 - another random generator
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
        RandomParkMiller - another random generator
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
        RandomMT19937 - another random generator
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
    [author:]
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
        Ported to Smalltalk by Claus Gittinger.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
"
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
! !
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
!RandomKISS2 class methodsFor:'instance creation'!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
new
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    ^ self basicNew 
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
        initialize;
3386
dc41f6b4fa89 better seeding
Claus Gittinger <cg@exept.de>
parents: 3382
diff changeset
    49
        seed:(Random randomSeed bitAnd:16rFFFFFFFF)
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
new:seed
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    ^ self basicNew 
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        initialize;
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        seed:seed
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
! !
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!RandomKISS2 methodsFor:'initialization'!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
initialize
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    x := 123456789. "/ <- any seed !!= 0
3382
0c6e6bcca5fb class: RandomKISS2
Claus Gittinger <cg@exept.de>
parents: 3366
diff changeset
    62
    y := 987654321.
0c6e6bcca5fb class: RandomKISS2
Claus Gittinger <cg@exept.de>
parents: 3366
diff changeset
    63
    z := 43219876.
0c6e6bcca5fb class: RandomKISS2
Claus Gittinger <cg@exept.de>
parents: 3366
diff changeset
    64
    c := 6543217.
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
seed:seed
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
    self assert:(seed ~= 0).
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
    x := seed.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
! !
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
!RandomKISS2 methodsFor:'random numbers'!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
nextBoolean
3418
7f8549e6ebfe comments
Claus Gittinger <cg@exept.de>
parents: 3400
diff changeset
    75
    "generates a boolean random"
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    ^ self nextInteger > 16r7FFFFFFF
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
nextInteger
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
    "generates the next integer in 0..FFFFFFFF"
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    |t|
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    "/ Linear Congruencegenerator
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    x := (314527869 * x) + 1234567.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    x := x bitAnd:16rFFFFFFFF.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    "/ Xorshift
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
    y := y bitXor:(y << 5).
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    y := y bitAnd:16rFFFFFFFF.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    y := y bitXor:(y >> 7).
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    y := y bitAnd:16rFFFFFFFF.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    y := y bitXor:(y << 22).
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    y := y bitAnd:16rFFFFFFFF.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    "/ Multiply-with-carry
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
    t := (4294584393 * z) + c.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    c := t >> 32.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    z := t bitAnd:16rFFFFFFFF.
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    ^ (x + y + z) bitAnd:16rFFFFFFFF
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
! !
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
!RandomKISS2 class methodsFor:'documentation'!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
version
4323
7caede8761de #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3418
diff changeset
   108
    ^ '$Header$'
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
!
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
version_CVS
4323
7caede8761de #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3418
diff changeset
   112
    ^ '$Header$'
3366
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
! !
9f2ba94535c2 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114