diff -r 000000000000 -r 1cf8d1747859 Random.st --- /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 +! !