RandomGNUSmalltalk.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5251 567f7b09329b
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:

"
======================================================================
|
| Copyright (C) 1988, 1989 Free Software Foundation, Inc.
| Written by Steve Byrne.
|
| This file is part of GNU Smalltalk.
|
| GNU Smalltalk is free software; you can redistribute it and/or modify it
| under the terms of the GNU General Public License as published by the Free
| Software Foundation; either version 1, or (at your option) any later version.
| 
| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
| FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
| details.
| 
| You should have received a copy of the GNU General Public License along with
| GNU Smalltalk; see the file LICENSE.  If not, write to the Free Software
| Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
|
======================================================================

see notice in (Random>>documentation)
"
"{ Package: 'stx:libbasic2' }"

"{ NameSpace: Smalltalk }"

Random subclass:#RandomGNUSmalltalk
	instanceVariableNames:'increment multiplier modulus'
	classVariableNames:'SharedGenerator'
	poolDictionaries:''
	category:'Magnitude-Numbers-Random'
!

!RandomGNUSmalltalk class methodsFor:'documentation'!

copyright
"
======================================================================
|
| Copyright (C) 1988, 1989 Free Software Foundation, Inc.
| Written by Steve Byrne.
|
| This file is part of GNU Smalltalk.
|
| GNU Smalltalk is free software; you can redistribute it and/or modify it
| under the terms of the GNU General Public License as published by the Free
| Software Foundation; either version 1, or (at your option) any later version.
| 
| GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
| ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
| FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
| details.
| 
| You should have received a copy of the GNU General Public License along with
| GNU Smalltalk; see the file LICENSE.  If not, write to the Free Software
| Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  
|
======================================================================

see notice in (Random>>documentation)
"
!

documentation
"
    WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
    =======================================================================================
    DO NOT USE THIS GENERATOR FOR CRYPTOGRAPHY OR OTHER SECURITY RELATED WORK, 
    because linear congruential generators are predictable and can be broken easily!!

    Smalltalk/X includes a better generator named RandomGenerator, 
    which uses the best available generator of the system 
    (either OS-random, /dev/random or as a less dangerous fallback, an RC4-based random generator).
    Please use that one.
    =======================================================================================

    A simple random numbers - thanks to Steves GNU Smalltalk

    This implements a linear congruential maximum period random number generator
    which passes the spectral test for randomness for dimensions 2 3 4 5 6.

    Notice: although being included here,
            this file is NOT covered by the ST/X license, but by
            the FSF copyLeft (see copyright method).

            You can redistribute it under the terms stated there ...
            Also, the price you pay for ST/X does not include a charge for
            this file - it has to be considered as a separate piece of
            software, which can be copied and given away without any 
            restriction from my (CG) side.

    [author:]
        Steve Byrne
        Claus Gittinger

    [see also:]
        http://www0.cs.ucl.ac.uk/staff/d.jones/GoodPracticeRNG.pdf
        RandomTT800      - a new random generator
        RandomParkMiller - another new random generator
"
!

examples
"
                                                                        [exBegin]
    |rnd|

    rnd := RandomGNUSmalltalk new.
    10 timesRepeat:[
        Transcript showCR:(rnd next)
    ]
                                                                        [exEnd]

    rolling a dice:
                                                                        [exBegin]
    |rnd|

    rnd := RandomGNUSmalltalk new.
    10 timesRepeat:[
        Transcript showCR:(rnd nextIntegerBetween:1 and:6)
    ]
                                                                        [exEnd]
"
! !

!RandomGNUSmalltalk methodsFor:'accessing-reading'!

maxInteger
    ^ modulus
!

nextBoolean
    "return true or false by random"

    self step.
    ^ seed < (modulus // 2)

    "
    |r|
     r := Random new.
     Transcript showCR:r nextBoolean.
     Transcript showCR:r nextBoolean.
     Transcript showCR:r nextBoolean.
     Transcript showCR:r nextBoolean.
    "

    "
     |r bag|
     r := Random new.
     bag := Bag new.
     1000000 timesRepeat:[
         bag add:(r nextBoolean).
     ].
     Transcript showCR:bag contents
    "

    "Modified: / 22-10-2008 / 15:17:57 / cg"
!

nextInteger
    "return the next integral random number,
     in the range 0 .. modulus (which is less than 16r3FFFFFFF).
     From Sedgewick's 'Algorithms', based on Lehmer's method.

     Take care, this returns an even number after each odd number!!"

    self step.
    ^ seed

    "
     |r|
     r := Random new.
     Transcript showCR:r nextInteger.
     Transcript showCR:r nextInteger.
     Transcript showCR:r nextInteger.
     Transcript showCR:r nextInteger.
    "

    "Modified: 1.4.1997 / 22:42:53 / cg"
! !

!RandomGNUSmalltalk methodsFor:'private'!

setSeed:seedValue
    "set the initial seed and intialite the PRNG parameters.
     These numbers implement a maximum period generator which passes
     the spectral test for randomness for dimensions 2 3 4 5 6 and
     the product does not overflow  2 raisedTo:29.

     These numbers are carefully choosen, so don't change them, 
     unless you know what you are doing!!"

    modulus := 244944 " 244957 " .
    multiplier := 1597.
    increment := 51749.
    seed := seedValue \\ modulus.

    self step.

    "Modified: / 12-11-1999 / 17:50:52 / stefan"
    "Created: / 26-05-2007 / 21:25:10 / cg"
!

step
    "compute the next random integer"

    seed := (seed * multiplier + increment) \\ modulus

    "Created: 1.4.1997 / 22:40:45 / cg"
    "Modified: 1.4.1997 / 22:43:01 / cg"
! !

!RandomGNUSmalltalk methodsFor:'reading'!

next
    "return the next random number in the range ]0..1["

    self step.
    ^ seed / modulus asFloat

    "
     |r|
     r := Random new.
     Transcript showCR:r next.
     Transcript showCR:r next.
     Transcript showCR:r next.
     Transcript showCR:r next.
    "

    "Modified: 1.4.1997 / 22:44:46 / cg"
! !

!RandomGNUSmalltalk class methodsFor:'documentation'!

version
    ^ '$Header$'
!

version_CVS
    ^ '$Header$'
! !