92 lines
2.1 KiB
Text
92 lines
2.1 KiB
Text
DECLARE FUNCTION randomNormal! ()
|
|
DECLARE SUB normalStats (sampleSize)
|
|
|
|
CONST pi = 3.141592653589793#
|
|
RANDOMIZE TIMER
|
|
|
|
CLS
|
|
CALL normalStats(100)
|
|
PRINT
|
|
CALL normalStats(1000)
|
|
PRINT
|
|
CALL normalStats(10000)
|
|
PRINT
|
|
CALL normalStats(100000)
|
|
PRINT "Press any key to quit"
|
|
END
|
|
|
|
SUB normalStats (sampleSize)
|
|
IF sampleSize < 1 THEN EXIT SUB
|
|
|
|
DIM r(1 TO sampleSize) AS SINGLE
|
|
DIM h(-1 TO 10) AS INTEGER
|
|
DIM sum AS DOUBLE: sum = 0!
|
|
DIM hSum AS INTEGER: hSum = 0
|
|
DIM i AS INTEGER
|
|
|
|
' Generate samples: mean 0.5, std 0.25
|
|
FOR i = 1 TO sampleSize
|
|
r(i) = .5 + randomNormal! / 4!
|
|
sum = sum + r(i)
|
|
|
|
IF r(i) < 0! THEN
|
|
h(-1) = h(-1) + 1
|
|
ELSEIF r(i) >= 1! THEN
|
|
h(10) = h(10) + 1
|
|
ELSE
|
|
h(INT(r(i) * 10)) = h(INT(r(i) * 10)) + 1
|
|
END IF
|
|
NEXT i
|
|
|
|
FOR i = -1 TO 10
|
|
hSum = hSum + h(i)
|
|
NEXT i
|
|
|
|
' Adjust if necessary (rounding error)
|
|
DIM adj AS INTEGER: adj = sampleSize - hSum
|
|
IF adj <> 0 THEN
|
|
FOR i = -1 TO 10
|
|
h(i) = h(i) + adj
|
|
IF h(i) >= 0 THEN EXIT FOR
|
|
h(i) = h(i) - adj
|
|
NEXT i
|
|
END IF
|
|
|
|
DIM mean AS DOUBLE: mean = sum / sampleSize
|
|
|
|
' Standard deviation
|
|
sum = 0!
|
|
FOR i = 1 TO sampleSize
|
|
sum = sum + (r(i) - mean) ^ 2!
|
|
NEXT i
|
|
DIM sd AS DOUBLE: sd = SQR(sum / sampleSize)
|
|
|
|
PRINT "Sample size"; sampleSize
|
|
PRINT
|
|
PRINT USING " Mean #.######"; mean;
|
|
PRINT USING " SD #.######"; sd
|
|
PRINT
|
|
|
|
' Histogram (scale large samples)
|
|
DIM numStars AS INTEGER
|
|
DIM scale AS DOUBLE: scale = 1!
|
|
IF sampleSize > 300 THEN scale = 300 / sampleSize
|
|
|
|
FOR i = -1 TO 10
|
|
IF i = -1 THEN
|
|
PRINT "< 0.00 : ";
|
|
ELSEIF i = 10 THEN
|
|
PRINT ">=1.00 : ";
|
|
ELSE
|
|
PRINT USING " #.## : "; i / 10;
|
|
END IF
|
|
|
|
PRINT USING "##### "; h(i);
|
|
numStars = INT(h(i) * scale + .5)
|
|
PRINT STRING$(numStars, "*")
|
|
NEXT i
|
|
END SUB
|
|
|
|
FUNCTION randomNormal!
|
|
randomNormal! = COS(2 * pi * RND) * SQR(-2 * LOG(RND))
|
|
END FUNCTION
|