Schneller Zufallsgenerator
-
srand(time(0)) restetted anhand der uhzeit in sekunden. ist also unfug, das innerhalb einer sekunde dauernd zu machen, weil der zufgen immer wieder auf den selben startwert reseted.
deswegen mache man srand(time(0)) num einmal in der main und fertig.
-
Ist das nicht das, was ich gesagt habe?!
zony
-
nein. du hast die worte "immer gleich schnell" da reingehudelt. die klingen danach, als hättest du ein ganz falsches bild von rand().
-
Ach übrigens, ich bräuchte noch ne Anregung, wie man diese Zahlen "aneinanderziehen" kann. Ich möchte eine Funktion, welche mir einen String(?) zurückgibt, die mir diese sechs Zahlen zurückgibt, aber durch einen Punkt zusammengezogen. Sozusagen:
int zusammen() { int x = rnr().rnr().rnr().rnr().rnr().rnr(); return x; }
Ich weiß, dass 'int' die falsche Deklaration ist und auch, dass die Zuweisung so nicht funktionieren kann, nur hab ich keine Ahnung, wonach ich suchen muss. Kann mir jemand helfen?
zony
-
Original erstellt von volkard:
nein. du hast die worte "immer gleich schnell" da reingehudelt. die klingen danach, als hättest du ein ganz falsches bild von rand().Ich hab mich vielleicht etwas falsch ausgedrückt, aber im Grunde meinte ich schon dasselbe.
zony
-
nimm am einfachsten sprintf dafür.
-
Dank dir!
zony
-
Ungeklärt ist leider immernoch der Datentyp, den eine Funktion haben muss, die einen "Text" zurückgibt (falls es da überhaupt einen gibt). Ich habe nun folgende Funktion:
1: int ausgabe() 2: { 3: char buffer[50]; 4: int iTmp; 5: iTmp = sprintf(buffer, "%d.%d.%d.%d", rnr(), rnr(), rnr(), rnr()); 6: return buffer; 7: } 6: warning: return makes integer from pointer without a cast 6: warning: function returns address of local variable
Es funktioniert zwar, jedoch kommen beim Kompilieren die oben genannten Fehler. Was hat das zu bedeuten? Mein Ziel ist es, die Variable 'buffer' (also die vier zuällig gewählten Zahlen, durch einen Punkt getrennt) in einer anderen Funktion zu verwenden. Danke schonmal.
zony
-
srand _immer_ nur einmal aufrufen.
-
ich denke an
void ausgabe(char* text)
und der, der ausgebe benutzt, legt vorher specher an und läßt ausgabe nur den speicher dann füllen.
-
Texte würd ich so machen:
Wenn beim Funktionsaufruf schon fest steht wie lang der zurück gegebene string ist dann so: char txt[50]; void FillIt(char* blub); FillIt(txt); // schreibt alles in blub rein oder wenns nicht feststeht char* givemesomthing() { char* adsd = malloc(irgendwas); fill adsd; return adsd; } freigegebn nicht vergessen char* blub = givemesomething(); free(blub);
-
maximallänge steht fest.
6 zahlen à 3 ziffern und 5 punkte und terminator.
-
volkard
*******Original erstellt von TheTester:
hy there
nur mal kurz ne frage bezogen auf den link von Dimah
kann mir mal jmd erklären warum das so sein soll?
bye
marcusdas ist unfug.
wenn man nur die niederwertigen bits nimmt, zum beispiel durch einsatz des modulo-ops (oder eben mit &), dann ist alles oksprich es ist nicht "gefährlich" den % operator zu verwenden...ja?
bye
marcus
-
Original erstellt von TheTester:
**sprich es ist nicht "gefährlich" den % operator zu verwenden...ja?
**jep ist es nicht!
schau mal ins Konsolen Forum
-
Original erstellt von TheTester:
**volkard
*******
sprich es ist nicht "gefährlich" den % operator zu verwenden...ja?
**es ganz sicher ist nicht gefährlich, den %-operator zu verwenden, um nur die niederwertigen bits zu benutzen. denn % mit zweirpotenzen (und nur so werden nur die niederwertigen bits benutzt) ist fein und da gibts keine ungleichverteilung.
im link steht
Oft sieht man dann, dass einfach nur die niederwertigsten Bits des Ergebnisses von rand() verwendet werden, zum Beispiel durch Einsatz des Modulo-Operators. Diese Praxis ist gefährlich, da das Ergebnis nun keine statistisch gesicherte gleichverteilte Zufallszahlenfolge mehr ist
und so isses unfug.
wenn man % aber mit anderen werten verwendet, also wo alle bits benutzt, dann gibts schieflagen in der verteilung. wie schlimm die sind, ist ne andere frage.
-
Und nochmal ein danke meinerseits.
zony
-
Original erstellt von zony:
**```cpp
1: int ausgabe(){
...
6: return buffer;
...
6: warning: return makes integer from pointer without a cast
6: warning: function returns address of local variableEs funktioniert zwar, jedoch kommen beim Kompilieren die oben genannten Fehler. Was hat das zu bedeuten?**
Du hast eine Funktion, die ein int zurückgeben soll, du lässt aber in Zeile 6 einen char*-Wert zurückgeben. Das geht so natürlich nicht...
-
Original erstellt von zony:
**Ungeklärt ist leider immernoch der Datentyp, den eine Funktion haben muss, die einen "Text" zurückgibt (falls es da überhaupt einen gibt). Ich habe nun folgende Funktion:1: int ausgabe() 2: { 3: char buffer[50]; 4: int iTmp; 5: iTmp = sprintf(buffer, "%d.%d.%d.%d", rnr(), rnr(), rnr(), rnr()); 6: return buffer; 7: } 6: warning: return makes integer from pointer without a cast 6: warning: function returns address of local variable
Es funktioniert zwar, jedoch kommen beim Kompilieren die oben genannten Fehler. Was hat das zu bedeuten? Mein Ziel ist es, die Variable 'buffer' (also die vier zuällig gewählten Zahlen, durch einen Punkt getrennt) in einer anderen Funktion zu verwenden. Danke schonmal.
zony**
Die Fehlermeldung is logisch, weil deine Funktion als int deklariert wurde du aber einen Pointer auf ein Char-array zurückgibst.
Was außerdem sowieso tötlich ist weil du das char Feld in der Funktion deklarierst, also wenn du den Pointer nachher verwenden würdest, würde dein Programm abstürtzen, weil das Array gar nbicht mehr existiert, also entweder das Feld static machen opder zB. so;bool ausgabe(char * Ergebnis)
{
Erbenis = new char[50];
etc...return false; //wenn funktion erflogreich
return true; // Wenn Fehler, zb kein Speicher(new)
}
-
Original erstellt von zony:
**Ungeklärt ist leider immernoch der Datentyp, den eine Funktion haben muss, die einen "Text" zurückgibt (falls es da überhaupt einen gibt). Ich habe nun folgende Funktion://int = Rückgabewert 1: int ausgabe() 2: { 3: char buffer[50]; 4: int iTmp; 5: iTmp = sprintf(buffer, "%d.%d.%d.%d", rnr(), rnr(), rnr(), rnr()); //Rückgabewert hier = char[] 6: return buffer; 7: } 6: warning: return makes integer from pointer without a cast 6: warning: function returns address of local variable
**
Hi!
Ich denke mal, dass das so nicht klappen wird.
Du hast als Rückgabewert einen Integer deklariert, gibst aber tatsächlich ein CHAR-Array zurück. Daher auch die warnung.
[cpp] char* ausgabe(void) [/cpp]
Damit sollte es klappen
-
verdammt.
meint ihr, ich sage void ausgabe(char* buf); nur um euch zu ärgern?