<?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[srand() , Array einer Klasse]]></title><description><![CDATA[<p>Hallo!</p>
<p>In der 1. Klasse erstelle ich mit einer Zeile eine große Anzahl der 2. Klasse:</p>
<pre><code class="language-cpp">//Aufruf aus 1. Klasse
myAnts=new ant[NUMBER_ANTS];
</code></pre>
<p>Nun brauche ich in der 2. Klasse aber rand()!<br />
Blöderweise wird für alle erzeugten Klassen der gleiche Zufallswert zurückgegeben!</p>
<pre><code class="language-cpp">//Im Konstruktor der 2. Klasse
position.setVector((double)rand()/RAND_MAX*PANEL_X,(double)rand()/RAND_MAX*PANEL_Y);
direction.setVector((double)rand()/RAND_MAX*360.0);
</code></pre>
<p>Nun habe ich srand(time(0)) schon an verschiedenen Stellen im Code probiert, leider erfolglos.<br />
Ich dachte bis jetzt immer der Zufallsgenerator startet bei einem Wert (wofür man eben srand braucht), und gibt dann der Reihe nach Zahlen aus.<br />
Anscheinend merkt sich der Zufallsgenerator aber nicht, dass er bereits die erste Zufallszahl in der Reihe zurückgegeben hat. Jedes mal im Konstruktor der 2. Klasse fängt er bei der gleichen Zufallszahl an. In der 2. Klasse aber srand(time(0)) aufrufen ist suboptimal, weil das ganze ja in weniger als 1s abläuft, und somit erst recht jedes Mal bei der gleichen Zahl gestartet wird und ich immer die gleichen Zufallszahlen erhalte.</p>
<p>Irgendwelche Ideen wie ich das hinbekommen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/287660/srand-array-einer-klasse</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 07:50:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287660.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 01 Jun 2011 16:37:10 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 16:37:10 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>In der 1. Klasse erstelle ich mit einer Zeile eine große Anzahl der 2. Klasse:</p>
<pre><code class="language-cpp">//Aufruf aus 1. Klasse
myAnts=new ant[NUMBER_ANTS];
</code></pre>
<p>Nun brauche ich in der 2. Klasse aber rand()!<br />
Blöderweise wird für alle erzeugten Klassen der gleiche Zufallswert zurückgegeben!</p>
<pre><code class="language-cpp">//Im Konstruktor der 2. Klasse
position.setVector((double)rand()/RAND_MAX*PANEL_X,(double)rand()/RAND_MAX*PANEL_Y);
direction.setVector((double)rand()/RAND_MAX*360.0);
</code></pre>
<p>Nun habe ich srand(time(0)) schon an verschiedenen Stellen im Code probiert, leider erfolglos.<br />
Ich dachte bis jetzt immer der Zufallsgenerator startet bei einem Wert (wofür man eben srand braucht), und gibt dann der Reihe nach Zahlen aus.<br />
Anscheinend merkt sich der Zufallsgenerator aber nicht, dass er bereits die erste Zufallszahl in der Reihe zurückgegeben hat. Jedes mal im Konstruktor der 2. Klasse fängt er bei der gleichen Zufallszahl an. In der 2. Klasse aber srand(time(0)) aufrufen ist suboptimal, weil das ganze ja in weniger als 1s abläuft, und somit erst recht jedes Mal bei der gleichen Zahl gestartet wird und ich immer die gleichen Zufallszahlen erhalte.</p>
<p>Irgendwelche Ideen wie ich das hinbekommen kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072105</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072105</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 16:37:10 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 16:43:24 GMT]]></title><description><![CDATA[<p>Erstmal solltest du <code>srand</code> nur am Programmanfang hinsetzten und sonst nie wieder aufrufen und zudem solltest du C++-Casts statt C-Casts verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072107</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072107</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 01 Jun 2011 16:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 16:48:40 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Erstmal solltest du <code>srand</code> nur am Programmanfang hinsetzten und sonst nie wieder aufrufen und zudem solltest du C++-Casts statt C-Casts verwenden.</p>
</blockquote>
<p>Ich habs in der Controller Klasse (oben als 1. Klasse bezeichnet) aufgerufen, diese wird nur ein einziges Mal erstellt.</p>
<pre><code class="language-cpp">//Aufruf aus 1. Klasse
srand(time(0));
myAnts=new ant[NUMBER_ANTS];
</code></pre>
<p>Leider bringt auch das nichts!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072108</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 16:48:40 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 16:54:49 GMT]]></title><description><![CDATA[<p>Vielleicht könntest du mal etwas mehr Code zeigen. Wenn die beiden Klassen nicht allzu gross sind könntest du diese vielleicht mal posten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072110</guid><dc:creator><![CDATA[icarus2]]></dc:creator><pubDate>Wed, 01 Jun 2011 16:54:49 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 17:01:03 GMT]]></title><description><![CDATA[<p>Ja klar, sind eh noch sehr kurz!</p>
<pre><code class="language-cpp">//1. Klasse
#include &quot;..\include\controller.h&quot;

#define NUMBER_ANTS 20
#define NUMBER_FOOD 50

controller::controller()
{
    //ctor
    srand(time(0)); //HIER!!! SRAND
    myAnts=new ant[NUMBER_ANTS];
    myFood=new food[NUMBER_FOOD];
}

controller::~controller()
{
    //dtor
}

void controller::drawTheSim(wxPaintDC *dc)
{

    wxColor color;

    color.Set(255,0,0,255);
    dc-&gt;SetBrush(wxBrush(color));
    dc-&gt;DrawRectangle(0,0,PANEL_X,PANEL_Y);

    for(int i=0;i&lt;NUMBER_ANTS;i++)
    {
        myAnts[i].drawTheAnt(dc);
    }

}
</code></pre>
<pre><code class="language-cpp">//2. Klasse
#include &quot;..\include\ant.h&quot;

ant::ant()
{
    //ctor
    antBrain=new ann(50,3);
    init();

    /*DATEI DEBUG
    FILE *f=0;
    f=fopen(&quot;dbgOut.txt&quot;,&quot;a+&quot;);
    fprintf(f,&quot;ANT\n&quot;);
    fclose(f);
    //ENDE DATEI DEBUG*/

}

ant::~ant()
{
    //dtor
    delete antBrain;
}
void ant::init()
{
//HIER!!! RAND AUFRUF
    position.setVector((double)rand()/RAND_MAX*PANEL_X, (double)rand()/RAND_MAX*PANEL_Y);
    direction.setVector((double)rand()/RAND_MAX*360.0);
    fullness=0;

//DATEI DEBUG
    FILE *f=0;
    f=fopen(&quot;dbgOut.txt&quot;,&quot;a+&quot;);
    fprintf(f,&quot;%f / %f\n&quot;,position.getX(),position.getY());
    fclose(f);
//ENDE DATEI DEBUG
    //direction.setVector(rand()%PANEL_X, rand()%PANEL_Y);
}

void ant::drawTheAnt(wxPaintDC *dc)
{
    dc-&gt;DrawLine(position.getX(), position.getY(), position.getX()+10*direction.getX(), position.getY()+10*direction.getY());
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2072113</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072113</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 17:01:03 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 17:07:06 GMT]]></title><description><![CDATA[<ol>
<li>Hier Fehlen die Deklarationen, die zeig uns bitte auch noch,</li>
<li>Ich sehe hier keinen Grund, die Variablen auf dem Heap zu erzeugen, vielleicht erschließt sich mir das ja bei 1)</li>
<li>#define für Konstanten ist nicht empfehlenswert. Benutze:</li>
</ol>
<pre><code class="language-cpp">const unsigned NUMBER_ANTS = 20;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2072117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072117</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 01 Jun 2011 17:07:06 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:10:12 GMT]]></title><description><![CDATA[<p>314159265358979 schrieb:</p>
<blockquote>
<ol>
<li>Hier Fehlen die Deklarationen, die zeig uns bitte auch noch,</li>
<li>Ich sehe hier keinen Grund, die Variablen auf dem Heap zu erzeugen, vielleicht erschließt sich mir das ja bei 1)</li>
<li>#define für Konstanten ist nicht empfehlenswert. Benutze:</li>
</ol>
<pre><code class="language-cpp">const unsigned NUMBER_ANTS = 20;
</code></pre>
</blockquote>
<p>Danke für die Hinweise, werde ich dann umsetzen!</p>
<p>Hier die Header Dateien:</p>
<pre><code class="language-cpp">#ifndef CONTROLLER_H
#define CONTROLLER_H

#include &quot;..\include\ant.h&quot;
#include &quot;..\include\food.h&quot;
#include &quot;..\include\globalVar.h&quot;

class controller
{
    public:
        controller();
        virtual ~controller();
        void drawTheSim(wxPaintDC *dc);
    protected:
        ant *myAnts;
        food *myFood;

    private:
};

#endif // CONTROLLER_H
</code></pre>
<pre><code class="language-cpp">#ifndef ANT_H
#define ANT_H

#include &quot;..\include\ann.h&quot;
#include &quot;..\include\vector2D.h&quot;
#include &quot;..\include\globalVar.h&quot;

class ant
{
    public:
        ant();
        virtual ~ant();
        void init();
        void drawTheAnt(wxPaintDC *dc);
    protected:
        vector2D direction,position;
        double fullness;
        ann *antBrain;
    private:
};

#endif // ANT_H
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2072124</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072124</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:10:12 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:15:37 GMT]]></title><description><![CDATA[<p>weiters verstehe ich nicht, warum sich das Programm beim Schließen aufhängt, falls ich im Controller Destructor die zuerst erstellten Variablen mit delete[] lösche:</p>
<pre><code class="language-cpp">delete[] myAnts;
    delete[] myFood;
</code></pre>
<p>Bei C hab ich ja auch immer zuerst malloc und dann free gemacht, wenn ich ein dynamisches Array hatte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072153</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:15:37 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:26:39 GMT]]></title><description><![CDATA[<p>Dann wirst du dabei wohl etwas falsch gemacht haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> . Ein erster offensichtlicher Fehler ist, dass du die Regel der großen Drei verletzt, die hier angebracht wäre.</p>
<p>Du weißt, dass es dynamische Arrays als fertige Klasse (std::vector) gibt, bei der speichertechnisch nichts mehr schiefgehen kann? Dann bräuchtest du dich auch nicht mehr um Destruktor, Kopier-Konstruktor und Zuweisungsoperator zu kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072158</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072158</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:26:39 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:33:09 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Dann wirst du dabei wohl etwas falsch gemacht haben <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /> . Ein erster offensichtlicher Fehler ist, dass du die Regel der großen Drei verletzt, die hier angebracht wäre.</p>
<p>Du weißt, dass es dynamische Arrays als fertige Klasse (std::vector) gibt, bei der speichertechnisch nichts mehr schiefgehen kann? Dann bräuchtest du dich auch nicht mehr um Destruktor, Kopier-Konstruktor und Zuweisungsoperator zu kümmern.</p>
</blockquote>
<p>Vektoren kenn ich, bin halt noch etwas C mäßig am Weg.<br />
Werd dann morgen die Arrays gegen std::vector austauschen, dann hat sich das Problem hoffentlich gelöst!</p>
<p>Das mit dem srand hab ich jetzt so gelöst, nicht gerade elegant, aber es klappt:<br />
srand(antAmount*time(0)); wobei mir antAmount angibt, wieviele Male der Ctor schon aufgerufen wurde.</p>
<p>Regel der großen Drei???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072164</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:33:09 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:35:16 GMT]]></title><description><![CDATA[<p>-&gt; Google<br />
Copy-Ctor, Copy op =, Destruktor. Implementierst du einen der drei, solltest du die anderen beiden auch Implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072165</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072165</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:35:16 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 18:35:50 GMT]]></title><description><![CDATA[<p>Glutamat schrieb:</p>
<blockquote>
<p>Regel der großen Drei???</p>
</blockquote>
<p>Wenn einer der folgenden drei Methoden implementiert ist, sollten es auch die anderen zwei sein:</p>
<ul>
<li>Copy-Konstruktor</li>
<li>Zuweisungsoperator</li>
<li>Destruktor</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/2072166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072166</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 01 Jun 2011 18:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to srand() , Array einer Klasse on Wed, 01 Jun 2011 20:25:03 GMT]]></title><description><![CDATA[<p>Problem gefunden:<br />
Irgendwo in den Untiefen einer von mir schon länger erstellten Klasse habe ich srand(time(0)) aufgerufen, und das hat mir das Problem beschert.</p>
<p>Danke nochmal für eure Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2072197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2072197</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 01 Jun 2011 20:25:03 GMT</pubDate></item></channel></rss>