RandomKISS.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 4593 0a3ae2abb281
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:
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic2' }"
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
4324
c3d7f79e34b0 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
     3
"{ NameSpace: Smalltalk }"
c3d7f79e34b0 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
     4
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
Object subclass:#RandomKISS
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	instanceVariableNames:'x y z c'
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	classVariableNames:''
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
	poolDictionaries:''
4593
0a3ae2abb281 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 4324
diff changeset
     9
	category:'Magnitude-Numbers-Random'
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
!RandomKISS class methodsFor:'documentation'!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
documentation
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
"
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    Warning: this generator should not be used for cryptographic work.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
    NO WARRANTY
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
4324
c3d7f79e34b0 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
    20
    KISS combines a linear congruence, XorShift and Lag with carry generator.
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
    The idea is from George Marsaglia.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
    RandomKISS new nextInteger
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
    (RandomKISS new:5489) nextInteger
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
    If heavily used, it may be useful to embed the original C code as inline C code for a big speedup)
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
    Please read:
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
        Wikipedia article on KISS http://de.wikipedia.org/wiki/KISS_(Zufallszahlengenerator)
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
        http://de.wikipedia.org/wiki/Liste_von_Zufallszahlengeneratoren
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
        http://eprint.iacr.org/2011/007.pdf  (KISS is not cryptographically secure)
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
    [see also:]
3390
5d3e4ea61bc5 documentation link
Claus Gittinger <cg@exept.de>
parents: 3384
diff changeset
    34
        http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf
3397
2c9a2efbb06c documentation link
Claus Gittinger <cg@exept.de>
parents: 3390
diff changeset
    35
        RandomGenerator - the default; uses the machine's /dev/random if available
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
        Random  - fast, but generates less quality random numbers
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
        RandomTT800 - another random generator
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
        RandomParkMiller - another random generator
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
        RandomMT19937 - another random generator
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
    [author:]
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
        Ported to Smalltalk by Claus Gittinger.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
"
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
! !
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!RandomKISS class methodsFor:'instance creation'!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
new
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
    ^ self basicNew 
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
        initialize;
3384
da820ca60855 better seeding
Claus Gittinger <cg@exept.de>
parents: 3365
diff changeset
    51
        seed:(Random randomSeed bitAnd:16rFFFFFFFF)
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
new:seed
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    ^ self basicNew 
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        initialize;
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        seed:seed
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
! !
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
!RandomKISS methodsFor:'initialization'!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
initialize
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    x := 123456789. "/ <- any seed !!= 0
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
    y := 362436000.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    z := 521288629.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
    c := 7654321.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
seed:seed
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
    self assert:(seed ~= 0).
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    x := seed.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
! !
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!RandomKISS methodsFor:'random numbers'!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
nextBoolean
3419
4b76d1a14086 comments
Claus Gittinger <cg@exept.de>
parents: 3397
diff changeset
    77
    "generates a boolean random"
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
    ^ self nextInteger > 16r7FFFFFFF
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
nextInteger
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
    "generates the next integer in 0..FFFFFFFF"
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    |t|
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    "/ Linear Congruencegenerator
3364
386f1893c6ba class: RandomKISS
Claus Gittinger <cg@exept.de>
parents: 3356
diff changeset
    88
    x := (69069 * x) + 12345.
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
    x := x bitAnd:16rFFFFFFFF.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
    "/ Xorshift
3364
386f1893c6ba class: RandomKISS
Claus Gittinger <cg@exept.de>
parents: 3356
diff changeset
    92
    y := y bitXor:(y << 13).
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
    y := y bitXor:(y >> 17).
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    y := y bitXor:(y << 5).
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    y := y bitAnd:16rFFFFFFFF.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    "/ Multiply-with-carry
3364
386f1893c6ba class: RandomKISS
Claus Gittinger <cg@exept.de>
parents: 3356
diff changeset
    98
    t := (698769069 * z) + c.
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
    c := t >> 32.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
    z := t bitAnd:16rFFFFFFFF.
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
    ^ (x + y + z) bitAnd:16rFFFFFFFF
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
! !
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
!RandomKISS class methodsFor:'documentation'!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
version
4324
c3d7f79e34b0 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
   108
    ^ '$Header$'
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
!
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
version_CVS
4324
c3d7f79e34b0 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3419
diff changeset
   112
    ^ '$Header$'
3356
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
! !
abf44c625c74 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114