10 ' 20 ' 30 ' APPROACH TO EQUILIBRIUM 40 ' 50 '-------------------- 1/5/88 ----------------------- 60 ' 70 ' This program calculates and plots the fractions of a 80 ' set of coins that are tails after a number of random 90 ' turns are made. 100 ' It is assumed all coins are initially heads. 110 ' 120 ' --> LIST OF PROCEDURES <-- 130 ' 140 GOSUB 240 ' INITIALIZATION 150 GOSUB 400 ' INPUT 160 GOSUB 670 ' RANDOMLY FLIP COINS NTURNS TIMES 170 GOSUB 1000 ' PLOT 180 ' 190 PRINT 200 INPUT "WANT TO RUN ANOTHER (Y/N)? ", AGAIN$ 210 IF AGAIN$ = "Y" OR AGAIN$ = "y" THEN 150 220 END 230 '------------------------------------------------------ 240 'INITIALIZATION: U = COIN'S STATUS; ' FR = TURN'S FRAC TAILS 250 ' $Z = PLOTTED TURN'S STRING 260 DIM U(1000), Z$(101), FR(1000) 270 DATA "|","*"," ","." 280 READ VLN$, ASTER$, BLANK$, DOT$ 290 ' 300 ' -- IX initializes the random number generator 310 ' 320 IX = 13 330 IC = 899 340 MAX = 32768! 350 MAXM = MAX - 1 360 NDOTS = 66 370 ' 380 RETURN 390 '------------------------------------------------------ 400 'INPUT 410 CLS 420 PRINT "INPUT VALUES FOR THE FOLLOWING:" 430 PRINT " NUMBER OF COINS (COINS)" 440 PRINT " NUMBER OF RANDOM TURNS (TURNS)" 450 PRINT 460 PRINT "SEPARATE VALUES WITH A COMMA, THEN PRESS RETURN" 470 PRINT 480 INPUT COINS, TURNS 490 PRINT 500 NCOINS = INT(COINS) 510 NTURNS = INT(TURNS) 520 NS = INT(NTURNS / 50) 530 IF NS = 0 THEN NS = 1 540 ' 550 ' -- the number of tails is initially zero 560 ' 570 TAILS = 0 580 ' 590 ' -- all coins are initially heads 600 ' 610 FOR K = 1 TO NCOINS 620 U(K) = 1 630 NEXT K 640 ' 650 RETURN 660 '------------------------------------------------------ 670 'RANDOMLY FLIP COINS NTURNS TIMES 680 ' 690 PRINT 700 PRINT "Flipping..."; 710 FOR NT = 1 TO NTURNS 720 ' 730 ' -- generate a random number 'RAN' 740 ' 750 IX = ABS(IC * IX) 760 IX = IX - MAX * INT(IX / MAX) 770 RAN = IX / MAXM 780 ' 790 ' -- end of random number generator 800 ' 810 ' -- J is a random number from 1 to NCOINS 820 ' 830 J = INT(RAN * (NCOINS - 1) + 1) 840 ' 850 ' -- turn the Jth coin over 860 ' 870 U(J) = -U(J) 880 ' 890 ' -- revise the number of tails 900 ' 910 TAILS = TAILS - U(J) 920 FR(NT) = TAILS / NCOINS 930 ' 940 NEXT NT 950 ' 960 PRINT " Finished!" 970 ' 980 RETURN 990 '------------------------------------------------------ 1000 'PLOT 1010 ' 1020 PRINT 1030 INPUT "PRINTER (Y/N)? ", ANS$:_ IF ANS$ = "y" THEN ANS$ = "Y" 1040 IF ANS$ = "Y" THEN OPEN "LPT1:" FOR OUTPUT AS #1 1050 IF ANS$ <> "Y" THEN OPEN "SCRN:" FOR OUTPUT AS #1 1060 PRINT #1, 1070 PRINT #1, COINS; " COINS" 1080 PRINT #1, TURNS; " TURNS" 1090 PRINT #1, 1100 PRINT #1, " FRAC. _ 50%" 1110 PRINT #1, "TURN TAILS "; 1120 FOR ND = 1 TO NDOTS 1130 Z$(ND) = BLANK$ 1140 PRINT #1, DOT$; 1150 NEXT ND 1160 PRINT #1, 1170 PRINT #1, " 0"; 1180 PRINT #1, " .00 "; 1190 Z$(51) = VLN$ 1200 Z$(1) = ASTER$ 1210 Z$(NDOTS) = DOT$ 1220 FOR I = 1 TO NDOTS 1230 PRINT #1, Z$(I); 1240 NEXT I 1250 PRINT #1, 1260 FOR NT = 1 TO NTURNS 1270 ' 1280 ' -- only plot a line if NT is a multiple of ' NS=TURNS/50 1290 ' 1300 IF NT > NS * INT(NT / NS) THEN 1460 'GOTO LOOP END 1310 ' 1320 F = FR(NT) 1330 PRINT #1, USING "####"; NT; 1340 PRINT #1, USING " .## "; F; 1350 L = INT(100 * F) + 1 1360 IF L > NDOTS THEN L = NDOTS 1370 Z$(51) = VLN$ 1380 Z$(1) = DOT$ 1390 Z$(NDOTS) = DOT$ 1400 Z$(L) = ASTER$ 1410 FOR I = 1 TO NDOTS 1420 PRINT #1, Z$(I); 1430 NEXT I 1440 PRINT #1, 1450 Z$(L) = BLANK$ 1460 NEXT NT 1470 ' 1480 PRINT #1, " "; 1490 FOR I = 1 TO NDOTS 1500 PRINT #1, DOT$; 1510 NEXT I 1520 CLOSE #1 1530 ' 1540 RETURN 1550 ' 1560 '------------- END OF PROGRAM LINES -------------------