10 ' 20 ' PSEUDORANDOM NUMBER GENERATOR 30 ' 40 '--------------------- 1/5/88 -------------------------- 50 ' 60 ' This program generates pseudorandom numbers using ' the power residue method, according to which each ' number is obtained from the preceeding one using the ' formula: X = C * X (MOD N). 90 ' 100 ' --> LIST OF PROCEDURES <-- 110 ' 120 GOSUB 230 'INITIALIZATIONS AND INPUT 130 GOSUB 450 'GENERATOR LOOP 140 GOSUB 670 'OUTPUT 150 ' 160 PRINT 170 INPUT "WANT TO RUN ANOTHER (Y/N)? ", AGAIN$ 180 IF AGAIN$ = "Y" OR AGAIN$ = "y" THEN 120 190 ' 200 END 210 ' 220 '------------------------------------------------------ 230 'INITIALIZATIONS AND INPUT 240 ' 250 DEFDBL Z 260 DIM RAN(6, 1000) 270 ' 280 CLS 290 PRINT "INPUT VALUES FOR:" 300 PRINT " NUMBER OF PSEUDORANDOM NUMBERS DESIRED (NUMNUM)" 310 PRINT " MODULUS (N)" 320 PRINT " FIRST NUMBER IN THE SERIES (X)" 330 PRINT " THE CONSTANT IN THE POWER RESIDUE SERIES (C)" 340 PRINT 350 PRINT "SEPARATE INPUT VALUES WITH COMMAS, PRESS RETURN" 360 PRINT 370 INPUT NUMNUM, ZN, ZX0, ZC 380 ' 390 ZX = ZX0 400 ZNM1 = ZN - 1 410 NN6 = INT(NUMNUM / 6) + 1 420 ' 430 RETURN 440 '------------------------------------------------------ 450 'GENERATOR LOOP 460 ' 470 ' -- Generate NMNUM random numbers, 6 at a time 480 ' 490 FOR J = 1 TO NN6 500 FOR K = 1 TO 6 510 IF (J - 1) * 6 + K > NUMNUM THEN CLOSE #1: RETURN 520 ' 530 ' -- Next 2 lines give: |IC*IX| (MOD N) 540 ' 550 ZT = ABS(ZC * ZX) 560 ZX = ZT - ZN * INT(ZT / ZN) 570 ' 580 ' -- Divide by N-1 so RAN is in the interval (0,1) 590 ' 600 RAN(J, K) = ZX / ZNM1 610 ' 620 NEXT K 630 NEXT J 640 ' 650 RETURN 660 '--------------------------------------------- 670 'OUTPUT 680 ' 690 INPUT "PRINTER (Y/N)? ", ANS$ 700 IF ANS$ = "y" OR ANS$ = "Y" THEN OPEN "LPT1:" FOR OUTPUT AS #1 710 IF ANS$ <> "y" AND ANS$ <> "Y" THEN OPEN "SCRN:" FOR OUTPUT AS #1 720 ' 730 PRINT #1, "# OF NUMBERS="; NUMNUM 740 PRINT #1, " MODULUS="; ZN 750 PRINT #1, "FIRST NUMBER="; ZX0 760 PRINT #1, " CONSTANT C="; ZC 770 PRINT #1, 780 ' 790 FOR J = 1 TO NN6 800 FOR K = 1 TO 6 810 IF 6 * J - 6 + K > NUMNUM THEN GOTO 860 820 ' 830 PRINT #1, USING "#.##### "; RAN(J, K); 840 ' 850 NEXT K 860 PRINT #1, 870 NEXT J 880 ' 890 CLOSE #1 900 ' 910 RETURN 920 '---------------END OF PROGRAM LINES ------------------