INSTALL @lib$+"TIMERLIB" DIM Buckets%(100) FOR i% = 1 TO 100 : Buckets%(i%) = RND(10) : NEXT tid0% = FN_ontimer(10, PROCdisplay, 1) tid1% = FN_ontimer(11, PROCflatten, 1) tid2% = FN_ontimer(12, PROCroughen, 1) ON ERROR PROCcleanup : REPORT : PRINT : END ON CLOSE PROCcleanup : QUIT REPEAT WAIT 0 UNTIL FALSE END DEF PROCdisplay PRINT SUM(Buckets%()) " ", MOD(Buckets%()) ENDPROC DEF PROCflatten LOCAL d%, i%, j% REPEAT i% = RND(100) j% = RND(100) UNTIL i%<>j% d% = Buckets%(i%) - Buckets%(j%) PROCatomicupdate(Buckets%(i%), Buckets%(j%), d% DIV 4) ENDPROC DEF PROCroughen LOCAL i%, j% REPEAT i% = RND(100) j% = RND(100) UNTIL i%<>j% PROCatomicupdate(Buckets%(i%), Buckets%(j%), RND(10)) ENDPROC DEF PROCatomicupdate(RETURN src%, RETURN dst%, amt%) IF amt% > src% amt% = src% IF amt% < -dst% amt% = -dst% src% -= amt% dst% += amt% ENDPROC DEF PROCcleanup PROC_killtimer(tid0%) PROC_killtimer(tid1%) PROC_killtimer(tid2%) ENDPROC