DECLARE SUB epsylon () DECLARE SUB pseurnd () DECLARE SUB random1 () DECLARE SUB xpos () DECLARE SUB ypos () DECLARE SUB vuldicht () DECLARE SUB Titel () COMMON SHARED nx%, ny%, dd, eps%, nt%, nn COMMON SHARED x%(), y%(), z%(), tel%() RANDOMIZE TIMER SCREEN 12 Titel Nog: CLS COLOR 11 PRINT " RANDOM verdeling binnen een ruimte." COLOR 15 PRINT : PRINT : PRINT PRINT " -> 1 = willekeurige verdeling" PRINT " -> 2 = gelijkmatige verdeling" PRINT " -> 3 = omtrent RANDIST" PRINT " -> ENTER = Stoppen" PRINT : PRINT : PRINT : COLOR 11 PLAY "l6b-" INPUT " -> Keuze : ", kies$ IF kies$ = "" THEN PLAY "l12c+egb->d" END END IF IF kies$ <> "1" AND kies$ <> "2" AND kies$ <> "3" GOTO Nog SELECT CASE kies$ CASE "1" xpos ypos vuldicht nn = nx% * ny% * dd IF nn > 32000 THEN nn = 32000: dd = nn / (nx% * ny%) PRINT : COLOR 12 PRINT USING ">>> Overflow >>> maximum dichtheid ##.## nemen"; dd PLAY "o4l12d": SLEEP 2: COLOR 15 CLS END IF REDIM z%(nx% * ny%) REDIM tel%(50) WINDOW (0, 0)-(nx% + 1, ny% * 1.05) CLS COLOR 12 LOCATE 1, 30 PRINT USING "dichth=##.##, ##### = ### X ### posities"; dd; nx% * ny%; nx%; ny% COLOR 15 random1 GOTO Nog CASE "2" xpos ypos epsylon xx% = nx% / eps% + nx% MOD eps% '''max. langs x, yy% = ny% / eps% + ny% MOD eps% ''' y, nt% = xx% * yy% '''te verwachten max. bezetting REDIM x%(nt%), y%(nt%) '''bezette posities CLS WINDOW (1, 1)-(nx% + 1, 1 + ny% * 1.05) pseurnd GOTO Nog CASE "3" Titel GOTO Nog END SELECT END SUB epsylon eps: PLAY "o4l12d": LOCATE 24, 1 INPUT " -> Kies min. afstand (default=3, 1 tot Nx of Ny) : ", eps% IF eps% = 0 THEN eps% = 3 IF eps% > nx% OR eps% > ny% OR eps% < 0 THEN LOCATE 20, 1 PRINT " " PLAY "o4l12d" GOTO eps END IF END SUB SUB pseurnd LOCATE 1, 1: COLOR 14: PRINT USING "Plaatsen:##### /Afstand:## /Max.:##### /Bezet:#####"; nx% * ny%; eps%; nt%; i% FOR i% = 1 TO nt% worp2: x% = 1 + RND * (nx% - 1) y% = 1 + RND * (ny% - 1) IF i% = 1 THEN GOTO verder FOR j% = 1 TO i% - 1 IF ABS(x% - x%(j%)) < eps% AND ABS(y% - y%(j%)) < eps% THEN tel1% = tel1% + 1 IF tel1% > 100 GOTO opvullen LOCATE 1, 60: COLOR 3: PRINT USING "Worp:###"; tel1%: COLOR 15 GOTO worp2 END IF NEXT j% verder: tel% = tel% + 1 x%(i%) = x%: y%(i%) = y% tel1% = 0 teken: LOCATE 1, 47: COLOR 14: PRINT USING "#####"; i%: COLOR 15 LINE (x%, y%)-(x% + 1, y% + 1), , BF volg: IF INKEY$ <> "" THEN PRINT "STOP": END NEXT i% opvullen: '''gaten zoeken en vullen tel1% = 0 i% = i% - 1 ii% = i% LOCATE 1, 60: COLOR 3: PRINT "Opvullen...": COLOR 15 PLAY "o4l12d" FOR y% = 1 TO ny% FOR x% = 1 TO nx% FOR j% = 1 TO i% IF ABS(x% - x%(j%)) < eps% AND ABS(y% - y%(j%)) < eps% GOTO volg2 NEXT j% i% = i% + 1 IF i% > nt% THEN i% = nt%: GOTO statist2 x%(i%) = x%: y%(i%) = y% tel1% = tel1% + 1 teken2: PLAY "o4l12d" LOCATE 1, 47: COLOR 14: PRINT USING "#####"; i%: COLOR 15 LOCATE 1, 60: COLOR 3: PRINT USING "Opvullen: ####"; tel1%: COLOR 15 LINE (x%, y%)-(x% + 1, y% + 1), 3, BF volg2: NEXT x% NEXT y% statist2: LOCATE 1, 60: COLOR 11: PRINT "-> Toets... " PLAY "o2l6a>l12fedc+" SLEEP: a$ = INKEY$ CLS PRINT USING "Vulstatistiek van de ##### bezettingen"; i% PRINT : PRINT : COLOR 15 PRINT " Aantal posities : "; nx% * ny% PRINT " gewenste afstand : "; eps% PRINT " max. bezetting : "; nt% PRINT "werkelijke bezetting door worpen : "; ii% PRINT " bezetting door opvullen : "; i% - ii% PRINT " totaal bekomen bezetting : "; i% PRINT " equivalente afstand : "; SQR(nx% * ny% / ii%) PRINT : PRINT : PRINT COLOR 11: PRINT " -> Toets..." COLOR 15 PLAY "l6d Toets...": COLOR 15 PLAY "o2l6a>l12fedc+" SLEEP: a$ = INKEY$ CLS : COLOR 11 PRINT USING "Vulstatistiek van de ##### posities (##### worpen)"; nx% * ny%; nx% * ny% * dd PRINT : PRINT : COLOR 15 FOR i% = 0 TO 20 PRINT USING "##.# percent #### maal geselecteerd"; tel%(i%) / (.01 * nx% * ny%); i% NEXT i% PRINT : PRINT : PRINT COLOR 11: PRINT " -> Toets..." COLOR 15 PLAY "l6d Toets..." COLOR 15 PRINT : PRINT : PRINT PRINT "Is een willekeurige verdeling van materie in de ruimte gelijkmatig?" PRINT "Is een gelijkmatige verdeling willekeurig?" PRINT PRINT "In dit programma maakt u kennis met twee soorten verdeling, beide" PRINT "kennelijk willekeurig." PRINT "Onze ruimte in kwestie beslaat een veld van (x,y) posities, " PRINT "aantal vooraf te bepalen. Elke worp (x,y) is volledig willekeurig." PRINT PRINT "De eerste verdeling accepteert elke worp. Het gevolg is dat bepaalde" PRINT "posities meermaals bezet kunnen worden (wat met materie niet het geval is)." PRINT "Andere posities kunnen leeg blijven. Het resultaat kan nogal verschillen" PRINT "naargelang de verhouding tussen het aantal 'worpen' en het aantal beschikbare" PRINT "plaatsen. " PRINT PRINT "De tweede verdeling accepteert slechts worpen die een gegeven afstand" PRINT "met de reeds bezette posities respecteren. Hier geen dubbele bezettingen:" PRINT "het is een deeltjeszwerm waar elk deeltje zegt: afstand houden!" PRINT PRINT "Met welke bezetting komt de spreiding van materie in de ruimte het best" PRINT "overeen? En moeten we dan al dat gezoek naar structuur in de massaverdeling" PRINT "in het heelal, met clusters en gaten, niet enigszins relativeren?" LOCATE 28, 1: COLOR 10: PRINT " Credits: Guido Wuyts 1996" PLAY "o2l6a>l12fedc+" COLOR 11 SLEEP: a$ = INKEY$ CLS COLOR 11 PRINT " RANDOM verdeling binnen een ruimte. (2/3) -> Toets..." COLOR 15: PRINT : PRINT : PRINT PRINT " 1. Willekeurige verdeling." PRINT PRINT "Neem een ruimte van N = Nx.Ny posities, gerangschikt volgens een" PRINT "x- en een y-richting (Nx en Ny plaatsen)." PRINT "Bezet plaatsen in deze ruimte met willekeurige worpen (x,y)." PRINT "Elke worp met gelijke kans." PRINT PRINT "Doe N maal D worpen: D = vuldichtheid (verhouding tussen aantal" PRINT "worpen en aantal beschikbare plaatsen. Vraag u volgende zaken af:" PRINT PRINT " -> hoeveel percent plaatsen wordt 1, 2, 3... maal geselecteerd?" PRINT " -> hoeveel percent plaatsen wordt niet geselecteerd?" PRINT " -> vanaf ongeveer welke dichtheid D praktisch volledige vulling?" PRINT PRINT " Merk voor kleinere dichtheden pseudostructuren op in de vorm van" PRINT " clusters, voor grotere in de vorm van gaten: een random-verdeling" PRINT " betekent Niet een regelmatige spreiding! Overigens is dit een" PRINT " fractale eigenschap die geldt voor alle schalen waarin materie" PRINT " geacht wordt zich te kunnen verdelen: nevels, galaxie‰n," PRINT " clusters, superclusters,..." LOCATE 28, 1: COLOR 10: PRINT " Credits: Guido Wuyts 1996" PLAY "l6d" SLEEP: a$ = INKEY$ CLS COLOR 11 PRINT " RANDOM verdeling binnen een ruimte. (3/3) -> Toets..." COLOR 15: PRINT : PRINT : PRINT PRINT " 2. Gelijkmatige verdeling." PRINT PRINT "Dezelfde ruimte van Nx.Ny = N posities. Alle worpen (x,y) eveneens" PRINT "willekeurig. Ditmaal echter aanvaarden we enkel bezetting van (x,y)" PRINT "indien de afstand tot alle vorige bezettingen niet onder een gekozen" PRINT "minimum ligt. Zoniet wordt de worp afgekeurd en een volgende worp gedaan." PRINT PRINT "Zodra het aantal 'vergeefse' worpen voor een bezetting boven honderd" PRINT "uitkomt, is de bezettingsdichtheid al zo groot dat de kans op een" PRINT "willekeurige, maar 'goede' worp snel afneemt. In deze faze veranderen" PRINT "we van strategie. We lopen alle posities systematisch af en checken" PRINT "elkeen op bezetbaarheid. Op deze wijze bereiken we de maximum bezetting" PRINT "die -nog- mogelijk is na het random begin." PRINT PRINT "Meestal bereiken we zo niet de maximaal mogelijke bezetting, gegeven" PRINT "de minimum afstand: die komt overeen met een regelmatige rooster-" PRINT "verdeling. Onze gelijkmatige verdeling behoudt dus toch een element" PRINT "van willekeurigheid. Een statistiekje vergelijkt de vereiste en " PRINT "gerealiseerde afstand, en overeenkomstige aantallen bezettingen." LOCATE 28, 1: COLOR 10: PRINT " Credits: Guido Wuyts 1996" PLAY " Kies vuldichtheid (default=.25, 0+ tot 10) : ", dd IF dd = 0 THEN dd = .25 IF dd < 0 OR dd > 10 THEN LOCATE 24, 1 PRINT " " PLAY "o4l12d" GOTO vul END IF END SUB SUB xpos xpos: PLAY "o4l12d": LOCATE 20, 1 INPUT " -> Kies aantal x-posities (default=65, 10 tot 200) : ", nx% IF nx% = 0 THEN nx% = 65 IF nx% < 10 OR nx% > 200 THEN LOCATE 20, 1 PRINT " " PLAY "o4l12d" GOTO xpos END IF END SUB SUB ypos ypos: PLAY "o4l12d": LOCATE 22, 1 INPUT " -> Kies aantal y-posities (default=40, 5 tot 150) : ", ny% IF ny% = 0 THEN ny% = 40 IF ny% < 5 OR ny% > 150 THEN LOCATE 22, 1 PRINT " " PLAY "o4l12d" GOTO ypos END IF END SUB