RosettaCodeData/Task/Statistics-Basic/ANSI-BASIC/statistics-basic.basic
2026-04-30 12:34:36 -04:00

60 lines
1.8 KiB
Text

100 REM Statistics/Basic
110 DECLARE EXTERNAL SUB BasicStats
120 CALL BasicStats(100)
130 PRINT
140 CALL BasicStats(1000)
150 PRINT
160 CALL BasicStats(10000)
170 PRINT
180 END
190 REM ***
200 EXTERNAL SUB BasicStats (SampleSize)
210 IF SampleSize < 1 THEN EXIT SUB
220 DIM R(1 TO 10000)
230 LET MaxSampleSize = UBOUND(R)
240 IF SampleSize > MaxSampleSize THEN
250 PRINT "Sample size too large"
260 STOP
270 END IF
280 RANDOMIZE
290 DIM H(0 TO 9) ! all zero by default
300 LET Sum = 0
310 LET HSum = 0
320 REM Gener!ate 'SampleSize' random numbers in the interval [0, 1)
330 REM calculate their Sum
340 REM and in which box they will fall when drawing the histogram
350 FOR I = 1 TO SampleSize
360 LET R(I) = RND
370 LET Sum = Sum + R(I)
380 LET H(INT(R(I) * 10)) = H(INT(R(I) * 10)) + 1
390 NEXT I
400 FOR I = 0 TO 9
410 LET HSum = HSum + H(I)
420 NEXT I
430 REM adjust one of the H() values if necessary to ensure HSum = SampleSize
440 LET Adj = SampleSize - HSum
450 IF Adj <> 0 THEN
460 FOR I = 0 TO 9
470 LET H(I) = H(I) + Adj
480 IF H(I) >= 0 THEN EXIT FOR
490 LET H(I) = H(I) - Adj
500 NEXT I
510 END IF
520 LET Mean = Sum / SampleSize
530 LET Sum = 0
540 REM Now calculate their standard deviation
550 FOR I = 1 TO SampleSize
560 LET Sum = Sum + (R(I) - Mean) ^ 2
570 NEXT I
580 LET Sd = SQR(Sum / SampleSize)
590 REM Draw a histogram of the data with interval 0.1
600 REM If sample size > 500 then normalize histogram to 500
610 LET Scale = 1
620 IF SampleSize > 500 THEN LET Scale = 500 / SampleSize
630 PRINT "Sample size"; SampleSize
640 PRINT USING " Mean #.###### SD #.######": Mean, Sd
650 FOR I = 0 TO 9
660 PRINT USING " #.## : ##### ": I / 10, H(I);
670 PRINT REPEAT$("*", ROUND(H(I) * Scale, 0))
680 NEXT I
690 END SUB