Abt. Ungestelltes Rätsel da oben
=====================
In ersten Simulationen ergaben sich je nach Reihenfolge der beiden ungeraden Tauschvorgänge ständig andere Ergebnisse. Das war aber falsch, wie sich bei näherem Durchdenken herausstellte!: Plätze können nur Läufer tauschen, die "Nachbarn" sind - es gibt keine "Doppel-Bocksprünge" über den mittleren Läufer. Das Ergebnis war dann stabil - aber noch immer falsch, weil die Ausgabe in Trikot-Nummern- statt Namensposiitionen erfolgen muss.
So hat sich letztlich das "intuitive" Ergebnis von AHT voll bestätigt: Selbst ein 2-stündiger Programmlauf mit zufälliger Platztauschreihenfolge lieferte keine anderen Ergebnisse - jetzt weiss ich wenigstens, warum!
War also ein ziemlich lehrreiches Beispiel, das ungestellte Rätsel!
Gruss
WindowTitle "Ungestelltes Rätsel: Laufsimulation"
Window %maxx/4,0 - %maxx/2,%maxy-40
font 1
randomize
declare p&,s&,t& ,tmp&,rn!,m&
declare ps&,st&,pt&, n&,verbose&
'Startreihenfolge = P:1 - S:2 - T:3
'P und S tauschen die Plätze. Das fand 9 mal statt.
'S und T tauschen die Plätze. Das fand 10 mal statt.
'P und T tauschen die Plätze. Das fand 11 mal statt.
'Das Geheimnis: Die Platz-Tauschvorgänge (9,10 und 11 mal) können nur vorkommen,
'wenn die jeweiligen Läufer gerade Nachbarn sind.
'Hier werden Wettläufe mit zufallsgesteuerten Überholvorgängen simuliert.
'Läufe, bei denen noch Überholvorgänge offen sind, die Läufer aber keine Nachbarn,
'müssen verworfen werden - der einzige Grund für die Stabilität des Ergebnisses!
verbose&=0 '1 = on, 0 = off
Print ansitooem$("\n Ausführlich? [0/1]: ";):input verbose&
while 1
inc m&
p&=1.:s&=2.:t&=3.
ps&=0:st&=0:pt&=0
case verbose&:print
n&=0
repeat
inc n&
rn!=rnd()
if rn!<1/3
if (ps&<9) and (abs(p&-s&)=1):tmp&=p&:p&=s&:s&=tmp&:inc ps&:endif
elseif (rn!>=1/3) and (rn!<2/3)
if (st&<10) and (abs(t&-s&)=1):tmp&=s&:s&=t&:t&=tmp&:inc st&:endif
elseif (rn!>=2/3)
if (pt&<11) and (abs(p&-t&)=1):tmp&=p&:p&=t&:t&=tmp&:inc pt&:endif
endif
if verbose&
print " P:",p&;"., S:",s&;"., T:",t&;". ";
print "Getauscht haben P<>S:";ps&;" S<>T:";st&;" P<>T:";pt&
endif
case n&>=200:BREAK
until (ps&=9) and (st&=10) and (pt&=11)
' Weitere Komplikation bei der Art der Ausgabe: Reihenfolge der numerierten Läufertrikots!
if n&<200
case verbose&:print " Laufergebnis: ";
'Ausgabe nicht p&,s&,t& sondern Platz 1,2,3:
print " ";m&;": ",
if verbose&
case p&=1:print " P",
case s&=1:print " S",
case t&=1:print " T",
case p&=2:print "P",
case s&=2:print "S",
case t&=2:print "T",
case p&=3:print "P = ",
case s&=3:print "S = ",
case t&=3:print "T = ",
endif
case p&=1:print "1",
case s&=1:print "2",
case t&=1:print "3",
case p&=2:print "1",
case s&=2:print "2",
case t&=2:print "3",
case p&=3:print "1"
case s&=3:print "2"
case t&=3:print "3"
ifnot (p&=3) and (s&=1) and (t&=2)
sound 2000,400
print "???????"
waitinput
endif
case verbose&:waitinput 500
else
if verbose&
print ansitooem$(" Nachbarschaftsfehler!")
sound 70,70
waitinput 500
endif
endif
endwhile
Alles anzeigen