<?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[Problem mit rand()...]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier ein Problem und würde mich freuen, wenn mir jemand helfen könnte.</p>
<p>mein Vorahaben:</p>
<ol>
<li></li>
</ol>
<p>für den TCP-Header benötige ich einen 4 Byte (32 bit) große positive Zufallszahl(Sequenznummer). Hier im Forum habe ich gelesen, dass rand() nur Zufallszahlen bis max 32767 (15 bit) generiert.<br />
<strong>Gibt es eine Alternative zu Rand, die es erlaubt 32bit große Zufallszahlen zu generieren oder muss ich mir das aus mehreren rand() selber zusammenschustern?</strong></p>
<ol start="2">
<li></li>
</ol>
<p>Wie oben erwähnt, arbeite ich mit einer 4 Byte großen Sequenznummer. Ich empfange die Bytes der Sequenznummer einzeln (also 4 seperate Bytes (unsigned char)).<br />
Diese Sequenznummer muss ich dann erhöhen:</p>
<p>**Was meint ihr, ist es sinnvoller die vier Byte der Sequenznummer zu einer Zahl zusammenfassen -&gt; sie erhöhen -&gt; und dann wieder in die 4 Byte aufzuteilen?</p>
<p>Oder ist es sinnvoller die Bytes einzel zu lassen und mit &quot;Überträge&quot; zu arbeiten?**</p>
<p>Freu mich über jeden Tipp, Info...<br />
vielen Dank im voraus Gruß<br />
Tupo13</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/127853/problem-mit-rand</link><generator>RSS for Node</generator><lastBuildDate>Tue, 25 Aug 2026 09:24:05 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/127853.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 Nov 2005 08:56:50 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 08:56:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>habe hier ein Problem und würde mich freuen, wenn mir jemand helfen könnte.</p>
<p>mein Vorahaben:</p>
<ol>
<li></li>
</ol>
<p>für den TCP-Header benötige ich einen 4 Byte (32 bit) große positive Zufallszahl(Sequenznummer). Hier im Forum habe ich gelesen, dass rand() nur Zufallszahlen bis max 32767 (15 bit) generiert.<br />
<strong>Gibt es eine Alternative zu Rand, die es erlaubt 32bit große Zufallszahlen zu generieren oder muss ich mir das aus mehreren rand() selber zusammenschustern?</strong></p>
<ol start="2">
<li></li>
</ol>
<p>Wie oben erwähnt, arbeite ich mit einer 4 Byte großen Sequenznummer. Ich empfange die Bytes der Sequenznummer einzeln (also 4 seperate Bytes (unsigned char)).<br />
Diese Sequenznummer muss ich dann erhöhen:</p>
<p>**Was meint ihr, ist es sinnvoller die vier Byte der Sequenznummer zu einer Zahl zusammenfassen -&gt; sie erhöhen -&gt; und dann wieder in die 4 Byte aufzuteilen?</p>
<p>Oder ist es sinnvoller die Bytes einzel zu lassen und mit &quot;Überträge&quot; zu arbeiten?**</p>
<p>Freu mich über jeden Tipp, Info...<br />
vielen Dank im voraus Gruß<br />
Tupo13</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928805</guid><dc:creator><![CDATA[Tupo13]]></dc:creator><pubDate>Mon, 28 Nov 2005 08:56:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 09:20:16 GMT]]></title><description><![CDATA[<p>1. Ich wäre für selber schreiben (google mal nach Zufallszahlen, da gibt es bestimmt etwas passendes). Im Notfall kannst du dir die Zahl auch aus zwei rand()-Aufrufen zusammenbauen:</p>
<pre><code class="language-cpp">lonq num=rand();
num=num&lt;&lt;16+rand();
</code></pre>
<p>2. Ich würde integer-Arithmetik verwenden (notfalls nimmst du eine union{long;char[4];} dafür).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928819</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928819</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Mon, 28 Nov 2005 09:20:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 09:22:04 GMT]]></title><description><![CDATA[<p>bei 1.) kann man statt + auch | nehmen:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ctime&gt;
#include &lt;cmath&gt;
using namespace std;

int rand32()
{
    return (rand()&lt;&lt;16) | rand();
}

int main()
{
    srand(time(0));
    cout &lt;&lt; rand32() &lt;&lt; endl;
    cin.get();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/928822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928822</guid><dc:creator><![CDATA[schorsch code]]></dc:creator><pubDate>Mon, 28 Nov 2005 09:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 09:29:05 GMT]]></title><description><![CDATA[<p>@ CStoll<br />
@ Schorsch</p>
<p>Danke für eure schnellen Antworten, werde es sofort ausprobieren</p>
<p>Gruß Tupo13</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928825</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928825</guid><dc:creator><![CDATA[Tupo13]]></dc:creator><pubDate>Mon, 28 Nov 2005 09:29:05 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 09:29:36 GMT]]></title><description><![CDATA[<p>Tupo13 schrieb:</p>
<blockquote>
<p>[b]Gibt es eine Alternative zu Rand, die es erlaubt 32bit große Zufallszahlen zu generieren</p>
</blockquote>
<p>ja. ich empfehle den multiply-with-carry-generator.</p>
<blockquote>
<p>oder muss ich mir das aus mehreren rand() selber zusammenschustern?</p>
</blockquote>
<p>geht auch. zeitkritisch dürfte bei dir ja nix sein.</p>
<blockquote>
<p>Oder ist es sinnvoller die Bytes einzel zu lassen und mit &quot;Überträge&quot; zu arbeiten?</p>
</blockquote>
<p>di erhöhst immer um 1? die wahrscheinlichkeit, einen übertrag zu kriegen, ist nur 1/256. also laß das zusammenfassen bleiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928826</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928826</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Nov 2005 09:29:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 09:43:21 GMT]]></title><description><![CDATA[<p>@ volkrad<br />
Danke, dein Tipp hört sich auch gut an werde mir es mal anschauen.</p>
<p>Die Sequenznummer wird allerdings nicht um eins erhöht, sondern um die Anzahl der bereits gesendeten Bytes.<br />
(Da kommt es leider öfters zu überträgen)</p>
<p>Gruß Tupo13</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928839</guid><dc:creator><![CDATA[Tupo13]]></dc:creator><pubDate>Mon, 28 Nov 2005 09:43:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 10:01:55 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//multiply-with-carry prng
//quelle
//http://cliodhna.cop.uop.edu/~hetrick/na_faq.html
//TODO: testen, ob alle seeds!=0 gute seeds sind
class Random{
private:
	u64 x;
public:
	Random(u64 seed){
		x=seed|(u64(1)&lt;&lt;32);
	}
	u32 operator()(){
		x=1967773755*(x&amp;0xffffffff)+(x&gt;&gt;32);
		return x;
	}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/928850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928850</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Nov 2005 10:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 13:42:11 GMT]]></title><description><![CDATA[<p>Ok, danke euch - habe es jetzt mal vorerst so gelöst.</p>
<p>Da es mit der 32bit Zufallszahl doch etwas kompilizierter (trotzdem vielen dank für die Lösungsvorschläge) ist habe ich pro Byte eine Zufallszahl errechnet.</p>
<pre><code class="language-cpp">void CCommunikation::fGetInitSequezNr(u_char bytSeqNr[])
{
	srand(time(NULL));		// Initialisierung mit der aktuellen Zeit

	for (int i=0; i&lt;4; i++)
	{	
		bytSeqNr[i]=rand() % 255;
	}
}
</code></pre>
<p>Das mit dem erhöhen habe ich so gelöst. Ist zwar nicht sonderlich schön, funktioniert aber:</p>
<pre><code class="language-cpp">void CCommunikation::fAddSequenceNr(u_char bytSeqNr[],int nCountAddBytes)
{

int aiSeqNrBuffer[4];
bool bBreakLoop = false;

aiSeqNrBuffer[0]=bytSeqNr[0] + nCountAddBytes;

do
{

// Byte 0
if (aiSeqNrBuffer[0] &gt; 255)
{
aiSeqNrBuffer[1]=bytSeqNr[1] + (aiSeqNrBuffer[0] / 0xff);
aiSeqNrBuffer[0]=(aiSeqNrBuffer[0] % 0xff);
bytSeqNr[0]=aiSeqNrBuffer[0];
}
else
{
bytSeqNr[0]=aiSeqNrBuffer[0];
return;
}

// Byte 1
if (aiSeqNrBuffer[1] &gt; 255)
{
aiSeqNrBuffer[2]=bytSeqNr[2] + (aiSeqNrBuffer[1] / 0xff);
aiSeqNrBuffer[1]=(aiSeqNrBuffer[1] % 0xff);
bytSeqNr[1]=aiSeqNrBuffer[1];
}
else
{
bytSeqNr[1]=aiSeqNrBuffer[1];
return;
}

// Byte 2
if (aiSeqNrBuffer[2] &gt; 255)
{
aiSeqNrBuffer[3]=bytSeqNr[3] + (aiSeqNrBuffer[2] / 0xff);
aiSeqNrBuffer[2]=(aiSeqNrBuffer[2] % 0xff);
bytSeqNr[2]=aiSeqNrBuffer[2];
}
else
{
bytSeqNr[2]=aiSeqNrBuffer[2];
return;
}

// Byte 3
if (aiSeqNrBuffer[3] &gt; 255)
{
aiSeqNrBuffer[0]=bytSeqNr[0] + (aiSeqNrBuffer[3] / 0xff);
aiSeqNrBuffer[3]=(aiSeqNrBuffer[3] % 0xff);
bytSeqNr[3]=aiSeqNrBuffer[3];
}
else
{
bytSeqNr[3]=aiSeqNrBuffer[3];
return;
}

// Byte 0
if (aiSeqNrBuffer[0] &gt; 255)
{
	bBreakLoop=true;
}
else
{
bytSeqNr[0]=aiSeqNrBuffer[0];
return;
}

}while (!bBreakLoop);

}
</code></pre>
<p>Falls jemand noch einen Tipp... hat wie man das ganze besser Lösen, Strukturieren kann - würde mich freuen</p>
<p>Gruß Tupo13</p>
]]></description><link>https://www.c-plusplus.net/forum/post/928971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/928971</guid><dc:creator><![CDATA[Tupo13]]></dc:creator><pubDate>Mon, 28 Nov 2005 13:42:11 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 19:05:54 GMT]]></title><description><![CDATA[<p>Tupo13 schrieb:</p>
<blockquote>
<p>Falls jemand noch einen Tipp... hat wie man das ganze besser Lösen, Strukturieren kann - würde mich freuen</p>
</blockquote>
<p>srand(time(NULL));<br />
darfst nur einmal machen, am besten am anfang der main(). sonst bringt's nix.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929185</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Nov 2005 19:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Mon, 28 Nov 2005 21:57:45 GMT]]></title><description><![CDATA[<p>Tupo13 schrieb:</p>
<blockquote>
<p>Falls jemand noch einen Tipp... hat wie man das ganze besser Lösen, Strukturieren kann - würde mich freuen</p>
</blockquote>
<p>Hallo Tupo,</p>
<p>Wenn das so ist:</p>
<p>Tupo13 schrieb:</p>
<blockquote>
<p>Die Sequenznummer wird allerdings nicht um eins erhöht, sondern um die Anzahl der bereits gesendeten Bytes.</p>
</blockquote>
<p>dann darfst Du nicht durch 0xff teilen sondern durch 0x100. Denn jedes u_char kann 0x100 Zahlenwerte darstellen - die 0 zählt mit.<br />
Weiter kannst Du die 4 identischen Programm-Stücke in eine Schleife stecken. Das Array 'int aiSeqNrBuffer[4];' benötigst Du nicht, die Ergebnisse werden später nicht wieder verwendet.</p>
<p>Alles zusammen könnte Dein Code so aussehen:</p>
<pre><code class="language-cpp">void CCommunikation::fAddSequenceNr( u_char bytSeqNr[],int nCountAddBytes )
{
    for( int i = 0 ; i&lt;4; ++i )
    {
        nCountAddBytes += bytSeqNr[i];
        bytSeqNr[i] = u_char( nCountAddBytes % 0x100 );
        nCountAddBytes /= 0x100;
    }
}
</code></pre>
<p>Die äußere Schleife habe ich jetzt einfach weggelassen. Angenommen in bytSeqNr[] steht der Wert { 0xff, 0xff, 0xff } und 'nCountAddBytes' sei gleich 2; soll dann der neuen bytSeqNr[] { 0x01, 0, 0, 0 } sein oder { 0x02, 0, 0,0 }? Ich meine, ersteres ist sinnvoll.</p>
<p>Weiter kannst Du nochmal überlegen, ob das eine Methode von CCommunikation sein muss; es werden keine Member geschrieben oder gelesen. Eine Funktion würde also reichen.</p>
<p>Zum Thema Zufallszahlen sollte man noch diesen Link beachten <a href="http://www.boost.org/libs/random/index.html" rel="nofollow">http://www.boost.org/libs/random/index.html</a></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929324</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929324</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 28 Nov 2005 21:57:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit rand()... on Tue, 29 Nov 2005 05:13:26 GMT]]></title><description><![CDATA[<p>rand() generiert Zufallszahlen bis RAND_MAX, das ist je nach System unterschiedlich. Gängig sind im Moment 2^31 - 1, auf uralten Systemen 2^15 - 1.</p>
<p>Wo das nicht reicht, schau dir mal <a href="http://www.boost.org/libs/random/index.html" rel="nofollow">http://www.boost.org/libs/random/index.html</a> an, da gibts Zufallszahlengeneratoren in allen Farben, Formen und Variationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/929369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/929369</guid><dc:creator><![CDATA[0xdeadbeef]]></dc:creator><pubDate>Tue, 29 Nov 2005 05:13:26 GMT</pubDate></item></channel></rss>