<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Zufalls-Punkte Effizienz-Problem]]></title><description><![CDATA[<p>Moin!<br />
Hab ein kleines Problem: ich möchte Punkte(x,y,z) mittels Zufall erzeugen. Dabei gibt es für jede Position im Raum unterschiedliche Chancen ob da ein Punkt ist oder nicht.<br />
Die Brute-Force-Methode :<br />
-zufällige Position auswählen, mittels Chance-Wert und einer weiteren Zufallszahl (Null bis MAX_CHANCE) entscheiden ob der Punkt gesetzt wird oder nicht.</p>
<p>Das ist bisher das schnellste was ich hinbekommen hab.<br />
Obwohl es im Raum eine menge Null-Chancen-Positionen gibt. Die Menge der Fehlversuche ist ziemlich enorm.</p>
<p>Ich hatte ursprünglich versucht alle Positionen incl. Chance in eine Liste zu speichern, eine Zufallszahl zu erzeugen (Null bis &lt;Summe aller Chancen&gt; )<br />
und die dann solange durch zu gehen bis zur richtigen Position.<br />
Dadurch dass ich die Null-Chancen von vornherein aus der Liste ausschließen konnte ging das auch einigermaßen Fix.<br />
Das Erebnis ist auch gut.</p>
<p>Aber Brute-Force ist überraschenderweise trotzdem schneller.</p>
<p>Ich kann mir nicht vorstellen dass dass das schnellstmögliche ist. Aber alles was mir sonst noch eingefallen ist, ist langsamer oder liefert ein völlig anderes Ergebnis.</p>
<p>Hat jemand evtl nen Denkanreiz?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/291228/zufalls-punkte-effizienz-problem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 19:40:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/291228.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 13 Aug 2011 09:58:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 09:58:25 GMT]]></title><description><![CDATA[<p>Moin!<br />
Hab ein kleines Problem: ich möchte Punkte(x,y,z) mittels Zufall erzeugen. Dabei gibt es für jede Position im Raum unterschiedliche Chancen ob da ein Punkt ist oder nicht.<br />
Die Brute-Force-Methode :<br />
-zufällige Position auswählen, mittels Chance-Wert und einer weiteren Zufallszahl (Null bis MAX_CHANCE) entscheiden ob der Punkt gesetzt wird oder nicht.</p>
<p>Das ist bisher das schnellste was ich hinbekommen hab.<br />
Obwohl es im Raum eine menge Null-Chancen-Positionen gibt. Die Menge der Fehlversuche ist ziemlich enorm.</p>
<p>Ich hatte ursprünglich versucht alle Positionen incl. Chance in eine Liste zu speichern, eine Zufallszahl zu erzeugen (Null bis &lt;Summe aller Chancen&gt; )<br />
und die dann solange durch zu gehen bis zur richtigen Position.<br />
Dadurch dass ich die Null-Chancen von vornherein aus der Liste ausschließen konnte ging das auch einigermaßen Fix.<br />
Das Erebnis ist auch gut.</p>
<p>Aber Brute-Force ist überraschenderweise trotzdem schneller.</p>
<p>Ich kann mir nicht vorstellen dass dass das schnellstmögliche ist. Aber alles was mir sonst noch eingefallen ist, ist langsamer oder liefert ein völlig anderes Ergebnis.</p>
<p>Hat jemand evtl nen Denkanreiz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105629</guid><dc:creator><![CDATA[rob_s]]></dc:creator><pubDate>Sat, 13 Aug 2011 09:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 10:06:43 GMT]]></title><description><![CDATA[<p>Die Technik, bei völlig wilden Verteilungen Zufallszahlen nach einem Versuch und Wegwerf Verfahren zu ziehen ist schon der übliche Weg. Besser geht es, wenn du eine die Verteilung durch irgendeine einfache Funktion beschreiben kannst? Oder wenigstens eine einigermaßen passende, umkehrbare Funktion als obere Grenze angeben kannst. Dann kann man nämlich nach Techniken die du in Numerikbüchern oder bei Google findest, Zufallszahlen nach dieser Funktion verteilt ziehen, die dann entweder schon gleich das sind was du möchtest oder dir wenigstens eine deutlich höhere Akzeptanzrate geben.</p>
<p>Ich gehe bei obigem Tipp übrigens davon aus, dass du unabhängige Zufallszahlen aus deiner Verteilung ziehen möchtest. Wenn du einfach eine Punktwolke nach deiner Verteilung erzeugen möchtest, egal in welcher Reihenfolge die Einzelpunkte erzeugt werden, könnte man, je nachdem wie wild die Verteilung ist, eventuell auch eine Monte-Carlo artige Erzeugungstechnik in Erwägung ziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105632</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105632</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 13 Aug 2011 10:06:43 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 10:34:32 GMT]]></title><description><![CDATA[<p>Falls x, y und z ziemlich begrenzt sind und die Chancen in eine nicht so riesige Anzahl von ganzen Zahlen aufgeteilt werden kann, könntest du jede Position zwischen 0 und &quot;MAX_CHANCE_INT&quot; mal in einen Vektor speichern, dann eine Zufallszahl zwischen 0 und .size() generieren und dir damit deinen Punkt aus dem Vektor holen.</p>
<p>Oh, noch ne Idee. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Wenn du MAX_CHANCE fließkommamäßig lassen willst, könntest du jeder erlaubten x-y-z-Kombination einen Bereich, der entsprechen der Wahrscheinlichkeit für den Punkt groß ist, in den Fließkommazahlen von 0 bis irgendwas zuweisen, die dann eine von 0 bis irgendwas erzeugen lassen und gucken, welchen deiner Kandidaten sie trifft.</p>
<p>Geht natürlich beides nur für recht kleine Mengen. SeppJs Ansatz ist natürlich skalierbarer, allgemeingültiger und eleganter. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105642</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 13 Aug 2011 10:34:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 10:50:41 GMT]]></title><description><![CDATA[<p>Welche Wertemengen haben für die Koordinaten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105646</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 13 Aug 2011 10:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 12:05:25 GMT]]></title><description><![CDATA[<p>rob_s schrieb:</p>
<blockquote>
<p>Moin!</p>
<p>Ich hatte ursprünglich versucht alle Positionen incl. Chance in eine Liste zu speichern</p>
</blockquote>
<p>Ich hoffe, es war keine Liste. Das wäre ziemlich doof.</p>
<p>Mein Ansatz wäre: wie du es gemacht hast, einen Vektor erzeugen. Allerdings mit der akkumulierten Wahrscheinlichkeit. Der erste Wert im Vector hat also irgendeine echt kleine zahl, der letzte ist 1. Und dann eine Binäre suche machen:</p>
<pre><code class="language-cpp">std::vector&lt;double&gt; accList; //accList[i]= p[0]+p[1]+...+p[i]
std::vector&lt;Vector&gt; coords; //coords[i] liefert die Position für das element i
//initialisiere lustig deine Liste...)

//algorithmus:
Vector draw(){
    double p = uniform();
    std::size_t minElem = 0;
    std::size_t maxElem = coords.size();
    while(minElem != maxElem){
        std::size_t pos = (maxElem-minElem)/2;
        if(p &gt; accList[i]){
            minElem = pos;
        }
        else
        {
            maxElem = pos;
        }
    }
    //hier gilt miNElem=maxElem = das gesuchte Element
    return coords[minElem];
}
</code></pre>
<p>ich bin mir gerade nicht 100% mit den indizes sicher, vielleicht muss man noch etwas daran rumdrehen, dass ja jedes Element ein Wahrscheinlichkeitsintervall darstellt...aber vom Prinzip her sollte da sklappen. Noch fixer wäre es, wenn du nen richtigen baum konstruierst, der die Wahrscheinlichkeiten auch in der Suchstruktur widerspiegelt. Meine Konstruktion sucht nach nem Knoten mit p=0.5 genauso lange wie bei einem p=0.00001 Knoten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105673</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 13 Aug 2011 12:05:25 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 14:40:22 GMT]]></title><description><![CDATA[<p>Danke schonmal für die vielen Antworten. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Die Monte-Carlo Sache gefällt mir. Gutes Beispiel für Irgendwann mal gelesen ums im richtigen Moment vergessen zu haben.</p>
<p>Leider langsamer. Kann vielleicht an der falschen Umsetzung liegen...</p>
<pre><code class="language-cpp">void Galaxy::AddStars3 (UINT nStars, perlin::Noise3D* pNoise)
{
	lblArray3&lt;float&gt; aPositions (m_fWidthX, m_fWidthY, m_fWidthZ);
	for (UINT nCreated = 0; nCreated &lt; nStars; )
	{
		UINT nRandRainX = Rand&lt;UINT&gt; (0, (UINT)m_fWidthX),
		     nRandRainY = Rand&lt;UINT&gt; (0, (UINT)m_fWidthY),
		     nRandRainZ = Rand&lt;UINT&gt; (0, (UINT)m_fWidthZ);

		float* pfData = aPositions(nRandRainX, nRandRainY, nRandRainZ);
		if (*pfData &lt; 0.0f) // Position bereits verwendet.
			continue;

		*pfData += pNoise-&gt;Get (nRandRainX, nRandRainY, nRandRainZ);
		if (*pfData &gt;= 1.0f) /* vielleicht auch höher als 1.0. Ausprobieren...*/
		{
			D3DXVECTOR3 vStarPos ((float)nRandRainX,
								  (float)nRandRainY,
								  (float)nRandRainZ);

			m_pStarTree-&gt;insert (new star (vStarPos));

			*pfData = -1.0f; // als 'verwendet' markieren
		}
	}
</code></pre>
<p>(Die Noise-Funktion liefert Werte zwischen 0 und 1)</p>
<p>Ihr anderen habt auch gute Ideen aber die hab ich jetzt noch nicht ausprobiert weil: Wenn schon Monte-Carlo (der ohne Listen aufbauen) auskommt langsamer ist, hab ich kaum Hoffnung daß das irgendwie weiterhilft...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105703</guid><dc:creator><![CDATA[rob_s]]></dc:creator><pubDate>Sat, 13 Aug 2011 14:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 14:45:30 GMT]]></title><description><![CDATA[<p>Wenn eine Liste (hier dann wohl implementiert als vector) nur einmal beim Programmstart aufgebaut werden muss, und dann aber nur noch über den Indexoperator drauf zugegriffen werden muss, kann das durchaus schneller sein als die Variante mit den vielen Fehlversuchen bis zum ersten gültigen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105704</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105704</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 13 Aug 2011 14:45:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 14:51:11 GMT]]></title><description><![CDATA[<p>Eine Liste würde nur fürs Erzeugen gebraucht. Danach nicht mehr.<br />
Ich glaub ich lass es einfach. Der Zeitaufwand ist besser als erträglich. Erebnis sieht auch gut aus...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105707</guid><dc:creator><![CDATA[rob_s]]></dc:creator><pubDate>Sat, 13 Aug 2011 14:51:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 14:54:15 GMT]]></title><description><![CDATA[<p>Verrätst du trotzdem noch, was fürn Wertebereich deine Punkte haben sollen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105709</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 13 Aug 2011 14:54:15 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 14:56:57 GMT]]></title><description><![CDATA[<p>-50.0f bis +50.0f pro Dimension</p>
<p>im Moment zumindest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105711</guid><dc:creator><![CDATA[rob_s]]></dc:creator><pubDate>Sat, 13 Aug 2011 14:56:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 15:49:01 GMT]]></title><description><![CDATA[<p>Wie hast du es dann eigentlich gemacht, dass jede Position ihre eigene Wahrscheinlichkeit hat wenn nicht mit Listen oder einer mathematischen Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105727</guid><dc:creator><![CDATA[Dobi]]></dc:creator><pubDate>Sat, 13 Aug 2011 15:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zufalls-Punkte Effizienz-Problem on Sat, 13 Aug 2011 17:12:51 GMT]]></title><description><![CDATA[<p>rob_s schrieb:</p>
<blockquote>
<p>Das ist bisher das schnellste was ich hinbekommen hab.<br />
Obwohl es im Raum eine menge Null-Chancen-Positionen gibt. Die Menge der Fehlversuche ist ziemlich enorm.</p>
</blockquote>
<p>Wenn sogar MC langsamer ist: was ist für dich &quot;enorm&quot;? Enorm beginnt für mich bei &gt;10^5 Fehlversuchen pro Treffer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2105744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2105744</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 13 Aug 2011 17:12:51 GMT</pubDate></item></channel></rss>