Technipion
Erfahrenes Mitglied
Okay ich gebe zu, es fällt mir schwer das zu erklären. Ich habe mir das grafisch hergeleitet. Deshalb habe ich jetzt schnell ein paar Diagramme erstellt und hier angehängt.Die Formelx//Y
verstehe ich ja noch (hatte ich im verlinkten Thread auch hergeleitet), aber wie kommst du auf(x+1)*Y%X
?
Erklärung:
Wir versuchen im Prinzip eine Gleichverteilung über alle Punkte (x,y) mit x,y < X und x != y zu erreichen.
Wenn man eine Liste L mit all diesen Punkten hätte, könnte man einfach
L[i]
mit i = floor(r * L.len)
und r in [0,1) zurückgeben. Ich glaube ziemlich genau das macht random.choice auch.In den Diagrammen sind die Punkte (x, x) die wir nicht wollen mit einer roten Linie gekennzeichnet. Das erste Diagramm zeigt woher die Formel x // Y kommt. Hier werden im Prinzip einfach Y mal die Zahlen von 0 bis Y wiederholt.
Das zweite Diagramm zeigt den y-Anteil mit (x+1)*Y % X. Die Punkte in jeder Zeile haben jeweils die Eigenschaft, dass sie k * Y mod X erfüllen. Wir laufen dieses k mit (x+1) ab.
Das letzte Diagramm zeigt dann die Überlagerung der x- und y-Werte. Wir fangen ganz oben links (sehr mathematischer Ausdruck) an und machen dann immer wieder Y-1 Schritte runter und dann einen nach rechts unten. Auf diese Weise laufen wir alle Punkte ab, bis auf die auf der roten Linie.
Das ganze hätte man bestimmt auch algebraisch herleiten können
Aber mir kam halt die Idee relativ spontan und ich wollte jetzt auch nicht Stunden nachrechnen sondern lieber codegolfen...
Gruß Technipion