--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Random.st Fri Jul 16 11:39:41 1993 +0200
@@ -0,0 +1,121 @@
+"======================================================================
+|
+| 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.
+|
+ ======================================================================"
+
+
+"
+| Change Log
+| ============================================================================
+| Author Date Change
+| claus 5 Apr 90 brought into Smalltalk/X
+| sbyrne 19 Sep 89 Converted to use real method categories.
+| sbyrne 3 Jul 89 created.
+|
+"
+
+Stream subclass:#Random
+ instanceVariableNames:'seed'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Magnitude-Numbers'
+!
+
+Random comment:'
+
+Copyright (C) 1988, 1989 Free Software Foundation, Inc.
+Written by Steve Byrne.
+
+random numbers - thanks to Steves GNU Smalltalk
+
+@(#)Random.st 2.3 92/06/06
+'!
+
+!Random class methodsFor: 'instance creation'!
+
+new
+ ^self basicNew setSeed
+! !
+
+!Random methodsFor:'testing'!
+
+chiSquare
+ "returns on Sun3 93.40000000000009"
+ ^self chiSquare: 1000 range: 100
+!
+
+chiSquare: n range: r
+ | f t s |
+ s := 1234567.
+ f := Array new: r + 1.
+ 1 to: r + 1 do: [ :i | f at: i put: 0 ].
+ n timesRepeat:
+ [ s := (seed * 31415821) + 1 bitAnd: 16r3FFFFFFF.
+ t := s \\ r.
+ f at: t + 1 put: (f at: t + 1) + 1 ].
+ t := 0.
+ 1 to: r do: [ :i | t := t + (f at: i) squared ].
+ ^r asFloat * t / n - n
+
+! !
+
+
+!Random methodsFor: 'basic'!
+
+atEnd
+ ^false
+!
+
+next
+ "From Sedgewick's 'Algorithms', based on Lehmer's method"
+
+ "the times: is a kludge - times does not convert to LargeInteger on overflow"
+ seed := (seed times:31415821) + 1 bitAnd: 16r3FFFFFFF.
+ ^seed / 16r3FFFFFFF asFloat
+!
+
+nextBoolean
+ "thanks to Peter Deutsch ..."
+ seed := (seed times:31415821) + 1 bitAnd: 16r3FFFFFFF.
+ ^ seed < 16r20000000
+!
+
+nextBetween:start and:stop
+ |rnd|
+ rnd := self next.
+ rnd := rnd * (stop asFloat - start asFloat + 1.0).
+ rnd := rnd + start asFloat.
+ ^ rnd
+!
+
+nextPut: value
+ self shouldNotImplement
+!
+
+nextMatchFor: aNumber
+ ^self next = aNumber
+! !
+
+
+!Random methodsFor: 'private'!
+
+setSeed
+ seed := Time secondClock bitAnd: 16r3FFFFFFF
+! !