' *********************************************************** ' PROGRAM: prob.bac ' PURPOSE: test of randomness ' AUTHOR: vovchik (Puppy Linux forum) ' COMMENTS: GPL ' DEPENDS: bash, bacon (b. 1.10) ' PLATFORM: Linux (actually, any *nix) ' DATE: 16-03-2010 ' VERSION: 0.1a ' *********************************************************** OPTION BASE 1 ' ***************** ' CONSTANTS ' ***************** CONST Index = 200000 ' ***************** ' END CONSTANTS ' ***************** ' ***************** ' DECLARATIONS ' ***************** GLOBAL Percent, Hit, Miss, Mean, MyIndex, MySum, Square, SD TYPE FLOATING GLOBAL Prob TYPE NUMBER GLOBAL MyNums[Index] TYPE FLOATING ' ***************** ' END DECLARATIONS ' ***************** ' ***************** ' FUNCTIONS ' ***************** '----------- DEF FN PR(P) = ISTRUE(P > RANDOM(100)) '----------- ' This function returns true at the specified probability, otherwise false ' i.e. PR(70) is true 70% of the time ' ***************** ' END FUNCTIONS ' ***************** ' ***************** ' SUBROUTINES ' ***************** '----------- SUB INIT_VARS '----------- SEED NOW Hit = 0.0 Miss = 0.0 Mean = 0.0 MySum = 0.0 MyIndex = Index MyLine$ = "-----------------------------" END SUB '----------- SUB GET_INPUT '----------- SPLIT ARGUMENT$ BY " " TO CliArgs$ SIZE MaxArgs IF LEN(CliArgs$[2]) < 1 OR VAL(CliArgs$[2]) < 0 OR VAL(CliArgs$[2]) > 99 THEN PRINT NL$ "This program requires an integer from 1 to 99 as the sole argument." PRINT NL$, "Example: prob 90", NL$ END ELSE Prob = VAL(CliArgs$[2]) END IF END SUB '----------- SUB POPULATE_ARRAY '----------- LOCAL i FOR i = 1 TO Index MyNums[i] = PR(Prob) IF MyNums[i] THEN Hit = Hit + 1 ELSE Miss = Miss + -1 END IF NEXT i END SUB '----------- SUB CALCULATE_MEAN '----------- LOCAL i FOR i = 1 TO Index MySum = MySum + MyNums[i] NEXT i MyIndex = Index Mean = MySum / MyIndex Percent = (Hit / MyIndex) * 100 END SUB '----------- SUB CALCULATE_SD '----------- LOCAL i FOR i = 1 TO Index Square = Square + POW((Mean - MyNums[i]), 2) NEXT i Square = Square / MyIndex SD = SQR(Square) END SUB '----------- SUB SHOW_RESULTS '----------- PRINT NL$, MyLine$ PRINT "Randomness test" PRINT MyLine$ PRINT "Probability : ", Prob, "%" PRINT "Iterations : ", Index PRINT "Hits : ", Hit PRINT "Misses : ", ABS(Miss) PRINT "Percent hits : ", Percent, "%" PRINT "Mean: : ", Mean PRINT "SD : ", SD PRINT MyLine$, NL$ END SUB ' ***************** ' END SUBROUTINES ' ***************** ' ***************** ' MAIN ' ***************** GET_INPUT INIT_VARS POPULATE_ARRAY CALCULATE_MEAN CALCULATE_SD SHOW_RESULTS END ' ***************** ' END MAIN ' *****************