Probleme beim Zufalls-Punkte erzeugen [gelöst]

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von detix » 05.01.2019 15:59:53

hikaru hat geschrieben:Die Idee ist algorithmisch gut, aber um ehrlich zu sein finde ich den Weg als Lösung der Aufgabe hässlich.
Das halte ich für falsch!
Beim Kreis dreht sich alles um den Mittelpunkt, entsprechend ist die Verteilung dort größer als woanders.
Ein Quadrat, oder ein Rechteck bei einer Ellipse, drumherum gebaut verteilt den Zufall wesentlich gleichmäßiger, das zusätzliche Löschen diverser Punkte außerhalb ist auch noch eine Erhöhung des Zufalls...
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von Lohengrin » 05.01.2019 16:29:55

rvb hat geschrieben: ↑ zum Beitrag ↑
05.01.2019 11:50:55
reox hat geschrieben: ↑ zum Beitrag ↑
05.01.2019 11:41:07
Vermutlich ist das mit dem Modulo einfach nicht so gut.
Ein einfaches Beispiel: angenommen, du hättest einen perfekten Zufallsgenerator, der Zahlen zwischen 0 und 8 absolut gleichverteilt liefert, aber möchtest eine Zufallszahl im Intervall [0,5] haben. Wenn du dazu einfach das Ergebnis des Zufallsgenerators modulo 6 nimmst, dann kriegst du zwar eine Zufallszahl im Intervall [0,5], aber die landet mit 2/3 Wahrscheinlichkeit im Intervall [0,2] und nur mit 1/3 Wahrscheinlichkeit im Intervall [3,5].

Das beste /dev/urandom hilft also nichts, wenn man hinterher ein Modulo dranhängt.
Den Effekt gibt es, aber er ist hier nicht sonderlich groß.
Es geht um eine Zahl zwischen 0 und 2^31-1, die dann Modulo 36000000 genommen wird. Das kommen Zahlen zwischen 0 und 23483647 häufiger vor als Zahlen zwischen 23483648 und 35999999. Das Verhältnis ist 60 zu 59.
Mit einer Null mehr, also 360000000 statt 36000000 wäre der Effekt erkennbar, dann kämen Zahlen zwischen 0 und 347483647 häufiger vor als Zahlen zwischen 347483648 und 359999999, und das mit dem Verhältnis 6 zu 5.

Das Kreuz ist damit gar nicht zu erklären.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von Lohengrin » 05.01.2019 16:50:45

rendegast hat geschrieben: ↑ zum Beitrag ↑
05.01.2019 07:27:20
Wurzel ( Zufall(0,1) ) * Kreisradius
Ist richtig.
Betrachte den Kreisring mit Innenradius r und Breite b. Der hat eine Fläche von π(r+b)^2-πr^2.
Sei der Kreisradius R. Dann landet alles im Kreisring, wo der Zufallsgenerator zwischen (r/R)^2 und ((r+b)/R)^2 ausgegeben hat.
Die Punktedichte, also "Punkte im Kreisring" geteilt durch "Fläche des Kreisrings", ist unabhängig von r.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von Lohengrin » 05.01.2019 17:13:29

hikaru hat geschrieben: ↑ zum Beitrag ↑
05.01.2019 12:33:45
Der Radius den heinz mit 2000 definiert hat, wird hier auf der Hochachse auf ±1 normiert und die Werte sollten durch den Zufallsgenerator gleichmäßig in diesem Wertebereich verteilt sein.
Der ist nur ±1, wenn der passende Winkel dazukommt. Dass bei Winkel nahe 0 viele x nahe Radius sind, muss so sein, weil das auf ein großes Stück in y-Richtung verteilt wird.
Ich denke, dass das, so wie es programmiert ist, genau passen müsste, kann mir das Kreuz nicht erklären.
hikaru hat geschrieben: ↑ zum Beitrag ↑
05.01.2019 12:33:45
Um ein halbwegs anschauliches Beispiel zu bringen, schauen wir uns mal 4 Punkte an, die alle auf dem Rarius r liegen:
A: φ=0°; B: φ=1°; C: φ=45°; D: φ=46°

Der Kosinus von A und B unterscheidet sich erst bei 10^-4, während C und D sich schon bei 10^-2 unterscheiden. Der Abstand zwischen A und B ist nahe 1, da sie kartesisch fast die selbe x-Koordinate haben. C und D unterscheiden sich dagegen in x unyd y um jeweils 1, was dazu führt, dass ihr Abstand nicht 1 sondern Wurzel 2 ist.
Bei A und B läuft der Kreisbogen parallel zur y-Achse. Bei C und D läuft er π/4 dazu. Das erklärt die Wurzel 2. Auf gleich langem Kreisbogen müssen gleich viele Punkte landen.

Ich sehe nicht, wie dadurch das Kreuz zustanden kommen soll.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
detix
Beiträge: 1743
Registriert: 07.02.2007 18:51:28
Wohnort: MK

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von detix » 06.01.2019 18:50:47

smutbert hat geschrieben:Ich liebe das Debianforum für solche Threads!!
Genauso ist es, und da man ja sonst nichts zu tun hat...
Ich hab weder Ahnung von inkscape noch von python, aber gar nicht feige in Vorhandenem mal rumzusuchen!
Herausgekommen ist eine Erweiterung (zu finden in Rendern) für inkscape, leider kein C.
Das sieht mit den gegebenen Einstellungen so aus, der Bildaufbau dauert hier ein paar Sekunden:
2000
Die beiden Erweiterungsdateien in ~/.config/inkscape/extensions/ speichern:
http://nopaste.debianforum.de/40572 als: Zufallspunkte_im_Kreis.inx
http://nopaste.debianforum.de/40573 als: Zufallspunkte_im_Kreis.py
Gruß an alle Debianer, und immer daran denken:
Macht ohne Haftung funktioniert nicht!

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von heinz » 06.01.2019 19:00:47

Hallo nochmal,

erstmal vielen Dank an alle fuer das rege Interesse an diesem Problem.

Zu meiner Schande muss ich gestehen, dass ich mit vielen der Mathe-Lastigen Kommentare nicht viel anfangen kann.

Aber ich hab mal weitergesucht und habe schliesslich das PGM mal in SDL ausprobiert.
Und siehe da, kein Kreuz...
NoPaste-Eintrag40575

Code: Alles auswählen

c++ z2z.cc -o z2z -I/usr/include/SDL -lSDL_gfx -lSDL -Wall
(Die haeufigkeit zur Mitte hin bekomme ich geloest und werd sie an/abschaltbar machen. Sieht ja auch nett aus...)

Die urspruengliche Aufgabe des Programms war, zufallswerte fuer Objekte in POV-Dateien einzusetzen.
Es scheint das irgendwie POVRAY fuer dieses seltsame Kreuz verantwortlich ist.
Obwohl ich nicht verstehe warum dem so ist.
Die Werte die in die POV-Datei eingetragen wurden sehen fuer mich korrekt aus.
NoPaste-Eintrag40574

Ich werde auf jeden Fall weiter experimentieren und falls ich auf eine Loesung stosse mich wieder melden.

Dankbare Gruesse,
heinz

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von MSfree » 06.01.2019 19:33:27

heinz hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 19:00:47
Es scheint das irgendwie POVRAY fuer dieses seltsame Kreuz verantwortlich ist.
Obwohl ich nicht verstehe warum dem so ist.
Die Werte die in die POV-Datei eingetragen wurden sehen fuer mich korrekt aus.
NoPaste-Eintrag40574
Nein, wenn ich die Punkte, die du nach nopaste kopiert hast, mit meinem Testprogramm auftrage, kommt das raus:
2001

Das Kreuz ist also in den Daten vorhanden. In der Folge muß natürlich auch povray ein Kreuz anzeigen.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von heinz » 06.01.2019 20:58:54

Hallo MSfree,
MSfree hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 19:33:27
Nein, wenn ich die Punkte, die du nach nopaste kopiert hast, mit meinem Testprogramm auftrage, kommt das raus:
Das Kreuz ist also in den Daten vorhanden. In der Folge muß natürlich auch povray ein Kreuz anzeigen.
Danke fuers ausprobieren!

Ich kapiere es nicht...
Habe es nochmal direkt in Pov, mit den Pov-Bordmitteln versucht und da ist das Kreuz auch drin...
NoPaste-Eintrag40576
Die rand()-Funktion von POV verwendet Werte von 0.0 - 1.0 also kein Modulo notwendig...

Gruss heinz

Edit:
Habe auch gerade mal (pi/180) weggelassen:

Code: Alles auswählen

translate <sin(W)*(-200+400*rand(Z1)),cos(W)*(-200+400*rand(Z1)),0>
Immernoch ein Kreuz...

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von MSfree » 06.01.2019 21:34:11

Mit povray kenn ich mich zu wenig aus, um deinen Code aus dem Stegreif auf Logikfehler untersuchen zu könne. Mir fällt allerdings auf, daß du mit

Code: Alles auswählen

#declare Z1=seed(0);
etwas initialisierst. "seed" deutet für mich auf den Startwert des Zufallszahlengenerators. Wenn man den immer mit dem selben Wert (hier Null) initialisiert, bekommt man auch immer die selbe Zufallszahlenfolge.

Es ist denkbar, daß mit seed(0) das Kreuz besonders auffällig ist, mit anderen seeds aber nicht.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von heinz » 06.01.2019 21:54:54

MSfree hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 21:34:11
Es ist denkbar, daß mit seed(0) das Kreuz besonders auffällig ist, mit anderen seeds aber nicht.
Das ist es leider auch nicht...

Ich habe mir Deinen Code NoPaste-Eintrag40569 nochmal genauer angesehen.
Den einzigen Unterschied den ich erkennen kann ist die Art, wie Du die "Dinger" zeichnest.
Welchen Zweck hat Deine Funktion void DrawDots? Wozu skalierst Du da was...
Wenn Du die Koordinaten in x(i),y(i) direckt "Zeichnen" wuerdest, wuede da das gleiche Bild herauskommen? Also ohne Kreuz?

Gruss heinz

Benutzeravatar
MSfree
Beiträge: 11604
Registriert: 25.09.2007 19:59:30

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von MSfree » 06.01.2019 22:12:20

heinz hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 21:54:54
Das ist es leider auch nicht...
Schade. :wink:
Welchen Zweck hat Deine Funktion void DrawDots? Wozu skalierst Du da was...
Die Funktion malt Punkte und sie ist für den Allgemeinfall ausgelegt.

Der "buffer" ist ein Array, bei dem jedes Pixel des Bildes einem "char" entspricht. Dieses Feld kann beliebig groß sein, also eine beliebige Breite und Höhe haben. (OK, beliebig im Sinne von: "muß noch ins RAM passen").

Die Punktkoordinaten in x und y können ebenfalls eine beliebiege Ausdehnung haben

Also muß vorher die Ausdehnung der Punktmenge bestimmt werden und die Punktkoordinaten so skaliert werden, daß sie in den "buffer" hineinpassen.

Ich weiß, das hätte ich mir für deinen Spezialfall auch sparen können, die Funktionen stammen aber aus meiner eigenen Funktionssammlung und die habe ich einfach recycelt.
Wenn Du die Koordinaten in x(i),y(i) direckt "Zeichnen" wuerdest, wuede da das gleiche Bild herauskommen? Also ohne Kreuz?
Die Skalierung, die sich in meinem Fall ergibt,ist 1.0, denn die Punkte haben einen Wertebereich von -200 bis +200 und die Zeichenfläche ist 400 x 400 Pixel. Wie gesagt, die Skalierung ist in diesem Fall unnötig, aber für den Allgemeinfall ausgelegt.

Der "gemalte" "buffer" wird dann mit der Funktion write_JPEG_file direkt als Bilddatei im JPEG-Format rausgeschrieben.

Kreuze bekomme ich mit meinem Programm allerdings nicht, egal ob ich die Zufallswerte mit Modulus oder mit MyRandom erzeuge.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von heinz » 06.01.2019 22:15:20

Oh verdammt...
Ich habe das Problem gefunden!

Ich habe den Radius nicht einmal berechnet und dann fuer sin und cos gemeinsam benutzt, sondern es so gemacht.
(Ich hatte vor auf diese Art auch einfach Ellipsen zu erstellen...)
for(int z=0 ; z<10000 ; z++)
{
float winkel=MyRandom(360.0);
float x = sin( winkel * (Pi / 180.0) ) * MyRandom(200.0);
float y = cos( winkel * (Pi / 180.0) ) * MyRandom(200.0);
}

Sorry, dass ich durch meine Dummheit Eure Zeit verschwendet habe... :oops:

Gruss heinz

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [gelöst] (eigene Dummheit)

Beitrag von heinz » 06.01.2019 22:50:55

Hallo MSfree,

Danke nochmal fuer Deine ausfuehrliche Erklaerung und Deine Geduld...

Gruss heinz

Benutzeravatar
hikaru
Moderator
Beiträge: 13900
Registriert: 09.04.2008 12:48:59

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von hikaru » 07.01.2019 10:36:28

heinz hat geschrieben: ↑ zum Beitrag ↑
06.01.2019 22:15:20
Ich habe den Radius nicht einmal berechnet und dann fuer sin und cos gemeinsam benutzt, sondern es so gemacht.
(Ich hatte vor auf diese Art auch einfach Ellipsen zu erstellen...)
for(int z=0 ; z<10000 ; z++)
{
float winkel=MyRandom(360.0);
float x = sin( winkel * (Pi / 180.0) ) * MyRandom(200.0);
float y = cos( winkel * (Pi / 180.0) ) * MyRandom(200.0);
}
Ich verstehe noch nicht, warum das zu der Kreuzbildung führt. Wenn man zwei verschiedene Zufallszahlen für den Radius in x- und y-Richtung wählt, liegt der Punkt zwar auf einer Ellipse statt auf einem Kreis, aber gemittelt über 10000 Punkte würde ich trotzdem eine gleichmäßige Verteilung* erwarten.

*) über alle Winkel, nicht über den Radius

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Probleme beim Zufalls-Punkte erzeugen

Beitrag von Lohengrin » 07.01.2019 11:19:13

hikaru hat geschrieben: ↑ zum Beitrag ↑
07.01.2019 10:36:28
Ich verstehe noch nicht, warum das zu der Kreuzbildung führt. Wenn man zwei verschiedene Zufallszahlen für den Radius in x- und y-Richtung wählt, liegt der Punkt zwar auf einer Ellipse statt auf einem Kreis, aber gemittelt über 10000 Punkte würde ich trotzdem eine gleichmäßige Verteilung* erwarten.
Zuerst kommt der Winkel. Daraus entsteht ein Punkt auf dem Kreis mit Radius 200, und das gleichverteilt. Beachte nun das Rechteck, das den Ursprung und diesen Punkt gegenüber hat. In dieses Rechteck wird ein Punkt gesetzt, und das gleichverteilt..
Das Ganze geschieht 10000 mal.

Die y-Achse und die x-Achse sind immer dabei. Je näher am Ursprung desto häufiger wird getroffen.
Harry, hol schon mal das Rasiermesser!

Benutzeravatar
hikaru
Moderator
Beiträge: 13900
Registriert: 09.04.2008 12:48:59

Re: Probleme beim Zufalls-Punkte erzeugen [gelöst] (eigene Dummheit)

Beitrag von hikaru » 07.01.2019 11:59:36

@Lohengrin:
Danke! Das war verständlich.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [gelöst] (eigene Dummheit)

Beitrag von heinz » 07.01.2019 23:18:54

hikaru hat geschrieben: ↑ zum Beitrag ↑
07.01.2019 11:59:36
@Lohengrin:
Danke! Das war verständlich.
Fuer mich leider nicht...

Lassen wir mal die haeufung der Punkte in der Mitte ausser acht.
Wie muesste denn die Formel aussehen um fuer x, y und z verschiedene Radien angeben zu koennen, ohne das ein Kreuz entsteht?

Ich habe weiterexperimentiert (allerdings im Moment nur unter POV) und die Formeln abgeaendert:
https://de.wikipedia.org/wiki/Ellipsoid

Code: Alles auswählen

Pseudocode:

 1  while ( Count < 10000 )
 2  {
 3    Wxy=rand()%360;
 4    Wz=rand()%360;

 5    Rx=rand()%400-200;
 6    Ry=rand()%200-100;
 7    Rz=rand()%100-50;

 8    X = sin( Wz * (pi/180) ) * cos( Wxy * (pi/180) ) * Rx ;
 9    Y = sin( Wz * (pi/180) ) * sin( Wxy * (pi/180) ) * Ry ;
10    Z = cos( Wz * (pi/180) ) * Rz ;

11    Count++;
12  }
Mit diesem "Konstrukt" bekomme ich wieder ein Kreuz.
2004

Ersetze ich in Zeile 9 >Ry< durch >Rx< (also beides mal identischer Radius) ist kein Kreuz zu sehen.
2005

Ersetze ich Zeile 9 durch:

Code: Alles auswählen

 9    Y = ( ( sin( Wz * (pi/180) ) * sin( Wxy * (pi/180) ) ) / 2 ) * Rx ;
sieht es gut aus.
2006

Ersetze ich Zeile 9 durch:

Code: Alles auswählen

 9    Y = ( ( sin( Wz * (pi/180) ) * sin( Wxy * (pi/180) ) ) / ( Rx / Ry ) ) * Rx ;
entsteht wieder ein Kreuz...

Ich habe als Jugendlicher nie verstanden, wofuer man Mathe mal gebrauchen koennte.
Heute weis ich es...

Ich waere sehr dankbar fuer etwas Nachhilfe in dieser Sache...

Gruss heinz

PS.
Die Bilder sind kleine Animationen die aber leider nicht direkt als solche angezeigt werden.
Wenn man die Bilder anklickt und dann nochmals anklickt, werden sie korrekt angezeigt...

Benutzeravatar
Lohengrin
Beiträge: 3227
Registriert: 29.08.2004 00:01:05
Wohnort: Montsalvat

Re: Probleme beim Zufalls-Punkte erzeugen [gelöst] (eigene Dummheit)

Beitrag von Lohengrin » 08.01.2019 07:18:58

heinz hat geschrieben: ↑ zum Beitrag ↑
07.01.2019 23:18:54
Lassen wir mal die haeufung der Punkte in der Mitte ausser acht.
Wie muesste denn die Formel aussehen um fuer x, y und z verschiedene Radien angeben zu koennen, ohne das ein Kreuz entsteht?
Du musst präzise formulieren, was du haben willst. Dann hast du auch schon die Lösung gefunden.

Du schreibst gleichverteilt aber sagst nicht genau, was du darunter verstehst.
Wenn du "auf gleiche Fläche gleich viele Punkte" meinst, ist die Häufung der Punkte in der Mitte schon ein Problem.

Was du gebaut hast, sieht am Anfang wie "auf gleiche Winkelabschnitte gleich viele Punkte" aus. Aber das machst du dann wieder kaputt, indem du den Punkt nicht dahin setzt, wo er den vorher ausgesuchten Winkel hätte.
Zum Winkel w gehört die Strecke von (0,0) nach (200*cos(w) , 200*sin(w)). Zwischen der x-Achse und dieser Strecke ist der Winkel w. Auf diese Strecke musst du den Punkt setzen, also eine Zufallszahl z zwischen 0 und 1, und dann x=z*200*cos(w) und y=z*200*sin(w).
Du hast aber zwei Zufallszahlen z0 und z1 gebaut, und dann x=z0*200*cos(w) und y=z1*200*cos(w) genommen. Das wird dann ein Punkt im Rechteck, wo die Diagonale die Strecke von eben ist. Bei einem Winkel zwischen 0 und 5 landet der Punkt irgendwo nahe der rechten x-Achse. Und bei einem Winkel zwischen 85 und 90 landet der Punkt irgendwo nahe der oberen y-Achse. Bei einem Winkel zwischen 40 und 50 landet er irgendwo im Rechteck, das fast ein Quadrat ist, also genauso häufig an einer Achse wie am anderen Ende des Rechtecks oder in der Mitte davon. Deshalb bekommst du das Kreuz.

Das Einfachste ist mMn Montecarlo. Du nimmst solange zwei Zufallszahlen z0 und z1 zwischen 0 und 1, bis z0^2+z1^2 < 1, dann rechnest du x=200*z0 und y=200*z1. Beim Kreis schmeißt du nur ein gutes Fünftel der Paare von Zufallszahlen weg.
Ellipsoid geht genauso. Da wiederholst du, bis du (z0/a)^2+(z1/b)^2+(z2/c)^2 < 1 hast.

Montecarlo macht man da, wo man früher integrieren musste. Das funktioniert nicht nur da, wo man das Integral nicht anders lösen kann. Das ist die Kanone, mit der man jeden Spatz trifft. Ein paar Millionen mal drauf geschossen und ausgezählt, ist heute eine Frage von Sekunden.
Harry, hol schon mal das Rasiermesser!

reox
Beiträge: 2521
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Probleme beim Zufalls-Punkte erzeugen [fast gelöst] (eigene Dummheit)

Beitrag von reox » 08.01.2019 10:48:33

Ich hab auch ein wenig gebraucht um das zu verstehen aber ich denke ich habs jetzt auch verstanden.

Nimm mal an du generierst nicht zufällige Winkel sondern nimmst 360 Winkel nacheinander, also für jedes Grad berechnest du die Zufallspunkte.
Dann spannst du im Endeffekt pro Winkel ein Rechteck auf, welches zwischen (0,0) und (cos(phi), sin(phi)) liegt.
In diesem Rechteck generierst du einen Punkt (x, y) wobei jede Koordinate zufällig ist. dH du erzeugst eigentlich zufällige Punkte innerhalb des Rechtecks, pro Winkel.
Wenn du dir jetzt vorstellst, dass du jedes mal so ein Rechteck erzeugst und dann einen Winkel weiter gehst, gibt es Punkte die von vielen Rechtecken bedeckt sind und welche mit wenigen. Entlang der Koordinatenachsen sind es eben mehr, daher siehst du dieses Kreuz.

2007

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [fast gelöst] (eigene Dummheit)

Beitrag von heinz » 08.01.2019 21:03:54

Vielen Dank nochmals fuer die Erklaerungen und vor allem fuer Eure Geduld!

Werde vor dem WE aber nicht mehr dazu kommen es umzusetzen...

Ich melde mich wieder...

Dankbare Gruesse heinz

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [fast gelöst] (eigene Dummheit)

Beitrag von heinz » 10.01.2019 19:39:29

Hallo,

es hat mir einfach keine Ruhe gelassen...

Mein derzeitiger Stand ist:

Code: Alles auswählen

int radX=2000;
int radY=1000;
int radZ=500;
double rad_faktorY=(double)radX/(double)radY;
double rad_faktorZ=(double)radX/(double)radZ;

while(count < 10000)
{
	double winkel=(double)(rand()%36000000)/100000.0;
	double winkelZ=(double)(rand()%36000000)/100000.0;
	double radius=rand()%radX;

	double XX=sin(winkelZ*(Pi/180.0)) * cos(winkel*(Pi/180.0)) * radius;
	double YY=( ( sin(winkelZ * (Pi/180.0)) * sin(winkel * (Pi/180.0)) ) / rad_faktorY ) * radius;
	double ZZ=( cos(winkelZ * (Pi/180.0)) / rad_faktorZ ) * radius;
}

Das Ergebnis sieht in der x/y-Achse jetzt gut aus
2013
aber nun habe ich das Problem auf der z-Achse...
2014

Werde das Projekt wohl vorerst aufgeben.
Meine Mathekenntnisse sind einfach nicht ausreichend...

Vielen Dank Euch allen fuer Eure Unterstuetzung.

Gruss heinz

reox
Beiträge: 2521
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Probleme beim Zufalls-Punkte erzeugen [aufgegeben]

Beitrag von reox » 11.01.2019 08:56:27

Kann es sein, dass das nur ein Artefakt ist, weil du die Achsen unterschiedlich skalierst?

Ansonsten schaut die Variante 3 Zufallszahlen: 2 Winkel + Radius gut aus.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [aufgegeben]

Beitrag von heinz » 11.01.2019 16:01:30

Hallo reox,
reox hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 08:56:27
Kann es sein, dass das nur ein Artefakt ist, weil du die Achsen unterschiedlich skalierst?
leider nicht.

Ich habe fuer die letzten Bilder

Code: Alles auswählen

int radX=2000;
int radY=2000;
int radZ=2000;
verwendet, weil man es dann besser erkennt. (Habe vergessen es dazu zu schreiben...)
Es ist egal welche Werte ich fuer x,y und z verwende, in der z-Achse ist eine starke haeufung bei nahe 0.

Gruss heinz

reox
Beiträge: 2521
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Probleme beim Zufalls-Punkte erzeugen [aufgegeben]

Beitrag von reox » 11.01.2019 16:49:02

Mhh interessant, also ich sehe dieses Phänomen auch:
2015 2016

Generiert mit:

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

N = 10000

r = 1

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

theta = np.pi * np.random.rand(N)
phi = 2 * np.pi * np.random.rand(N)
radius = r * np.random.rand(N)

x = np.sin(theta) * np.cos(phi) * radius;
y = np.sin(theta) * np.sin(phi) * radius;
z = np.cos(theta) * radius

ax.scatter(x, y, z)
plt.show()
Eine Frage wäre jetzt: Wie kann man zB ein Histogramm erzeugen aus den Koordinaten um zu schauen ob die Verteilung passt?

Also es schaut so aus, als ob die Verteilung an den Polen größer ist. Nur warum? Offenbar erzeugt die Verteilung von phi und radius das erwartete Bild. Nur theta scheint nicht das zu tun was wir erwarten.

Edit: Theta darf nur werte zwischen [0, pi] haben. Ändert aber auch nichts am Bild.

Benutzeravatar
heinz
Beiträge: 535
Registriert: 20.12.2007 01:43:49

Re: Probleme beim Zufalls-Punkte erzeugen [aufgegeben]

Beitrag von heinz » 11.01.2019 17:53:15

reox hat geschrieben: ↑ zum Beitrag ↑
11.01.2019 16:49:02
Eine Frage wäre jetzt: Wie kann man zB ein Histogramm erzeugen aus den Koordinaten um zu schauen ob die Verteilung passt?
Also wenn ich die Z-Koordinaten aus der erzeugten POV-Datei mal nach der Haeufigkeit aufliste, erkennt man sehr gut
wie sie in der naehe von 0 zunimmt.
Habe die Nachkommastellen mal weggelassen und dann die Haeufigkeit der Werte ermittelt.

Code: Alles auswählen

grep '^translate' ./zufall.pov |cut -f3 -d','|tr -d '>'|cut -f1 -d'.'|sort -g|uniq -c >./z-h.txt
NoPaste-Eintrag40584
Erste Spalte=Haeufigkeit
Zweite Spalte=Z-Werte

Meintest Du sowas?

Gruss heinz

[Edit:]
Sorry, das war Quatsch.
Das zeigt nur die Anhaeufung um die Mitte.

Antworten