PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : rand() spuckt immer 88 aus...


Gast
2007-08-18, 17:22:53
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int main()
{
int superzahl = rand() % 1000;
printf("%d", superzahl);
getchar();
return 0;
}


Jedes Mal wenn ich das Programm starte wird 88 ausgegeben. Warum?

rotalever
2007-08-18, 17:27:46
Muss vorher initialisiert werden.
srand () hieß das glaube ich. Zum initialisieren zum Beispiel die Uhrzeit nehmen.

DaEmpty
2007-08-18, 21:36:47
Muss vorher initialisiert werden.
Auch dann werden keine Zufallszahlen erzeugt.
rand produziert nur Pseudozufallszahlen.

Neomi
2007-08-18, 22:45:41
Auch dann werden keine Zufallszahlen erzeugt.
rand produziert nur Pseudozufallszahlen.

Keiner hat hier was anderes behauptet. Und daß eine Software, egal welche, eh keine "echten" Zufallszahlen ausspucken kann, sollte sowieso jedem klar sein.

rotalever
2007-08-18, 22:49:21
Für "echte" Zufallszahlen gibt es solche Hardwaremodule mit halbdurchlässigen Spiegeln, wo dann einzelne Lichteilchen über den Zufall entscheiden.

DaEmpty
2007-08-19, 11:17:02
Keiner hat hier was anderes behauptet. Und daß eine Software, egal welche, eh keine "echten" Zufallszahlen ausspucken kann, sollte sowieso jedem klar sein.
Es war offensichtlich eine Anfängerfrage und Anfängern ist sowas in der Regel nicht bekannt. Wäre es ihm bekannt gewesen, hätte er bestimmt nicht gefragt, warum er immer die selbe Zahl zurückbekommt.
Da ich ein Gegner davon bin, Leute mit der lapidaren Aussage abzuspeisen, man müsste nur alles richtig initalisieren, dachte ich ein kurzer Hinweis wäre nicht verkehrt. Das Wissen bekommt man schliesslich nicht bei der Geburt eingetrichtert.

tokugawa
2007-08-19, 12:53:21
Es war offensichtlich eine Anfängerfrage und Anfängern ist sowas in der Regel nicht bekannt. Wäre es ihm bekannt gewesen, hätte er bestimmt nicht gefragt, warum er immer die selbe Zahl zurückbekommt.
Da ich ein Gegner davon bin, Leute mit der lapidaren Aussage abzuspeisen, man müsste nur alles richtig initalisieren, dachte ich ein kurzer Hinweis wäre nicht verkehrt. Das Wissen bekommt man schliesslich nicht bei der Geburt eingetrichtert.

Dann hätte ich aber gleich die komplette Information ausgespuckt, dass rand() zwar immer nur Pseudo-Zufallszahlen produziert, aber mittels seeden auf einen Wert der bei Programmstart immer anders ist (Zeit z.B.) ein zufallsähnliches Verhalten (hinreichend für den meisten Programmbedarf) erzeugt.

Wenn du nur schreibst "selbst dann erzeugt rand() keine Zufallszahlen" würde ein Anfänger - um den du ja besorgt zu sein scheinst - wahrscheinlich denken dass auch bei srand() mit (immer variierendem) Zeitparameter er immer dieselbe Zahl bekommt; es also nicht das tut was er will.

Im Prinzip war dein Posting deswegen verwirrungsstiftend (für Anfänger), weil es klingt als würdest du im Prinzip das zweite Posting - das bereits geholfen hat - negieren.

SimonX
2007-08-19, 13:26:51
Um noch mehr Verwirrung zu stiften:

rand() ist generell nicht gut. Man sollet besser lrand48() benutzen. Auch mit lrand48() muss man beim Programmstart einmal srand48() benutzen, damit Programme auch unterschiedliche Zufallszahlen generieren.

Nur die Zeit für srand() or srand48() zu benutzen wird keine zufriedenstelleden Ergebnisse lieferen. Wenn man nämlich das Programm in einem Script laufen lässt, dann sind die Zeiten von zwei läufen oft gleich. Also bekommt man wieder die gleiche Zufallszahlensequenze (und im Speziellen, die gleiche erste Zufallszahl). Also sollte man noch andere Daten hinzuziehen wie z.B. die Prozess-Id und die Microsekunden.

Unter Linux würde ich das Random-Generator-Device /dev/random (oder so) zu Initializierung von lrand48() benutzen. Ich würde aber /dev/random nicht als Ersatz für lrand48() benutzen, da ein System-Call (um die Zahl zu lesen) deutlich langsamer ist als eine Funktion im aktuellen Programm.

hadez16
2007-08-19, 13:45:31
srand(time(NULL));

muss an den anfang

Gast
2007-08-19, 14:02:08
Unter Windows: CryptGenRandom

rotalever
2007-08-19, 17:20:33
Was ist denn besser an lrand48?

DaEmpty
2007-08-19, 19:11:33
Dann hätte ich aber gleich die komplette Information ausgespuckt.
Du, aber nicht ich. Mach ich mit Studenten genauso und die sind im Endeffekt recht froh drüber, weil es dazu führt, dass sie merken etwas nicht verstanden zu haben und es sich selbst anschauen.
Aber wayne... Ich Zukunft unterlasse ich die Versuche zu helfen.

del_4901
2007-08-19, 19:15:05
Du, aber nicht ich. Mach ich mit Studenten genauso und die sind im Endeffekt recht froh drüber, weil es dazu führt, dass sie merken etwas nicht verstanden zu haben und es sich selbst anschauen.
Aber wayne... Ich Zukunft unterlasse ich die Versuche zu helfen.

Einsicht ist er erste Weg zur Besserung!

rotalever
2007-08-19, 20:19:09
Du, aber nicht ich.
Ist aber IMO nicht sehr sinnvoll. Was bringt es mir wenn mir jemand sagt, dass etwas falsch ist, aber nicht sagt, wie es richtig ist. Für mich sieht das immer so etwas danach aus, dass derjenige auch nicht wirklich Ahnung davon hat wovon er spricht (ist jetzt nicht negativ auf dich zu sehen).

tokugawa
2007-08-20, 18:30:31
Du, aber nicht ich. Mach ich mit Studenten genauso und die sind im Endeffekt recht froh drüber, weil es dazu führt, dass sie merken etwas nicht verstanden zu haben und es sich selbst anschauen.


Das ist schon schön und gut, und ich stimme dir prinzipiell auch zu (mach ich mit meinen Studenten genauso). Nur kommt es eben auch darauf an, welche Information man versteckt (und die Studenten selbst suchen lässt) und welche man hergibt.

Letztendlich sollte der Student durch die Information sich nicht noch weniger auskennen - sondern dazu motiviert werden die restliche Information zu suchen.

Gast
2007-08-20, 19:08:16
Nur die Zeit für srand() or srand48() zu benutzen wird keine zufriedenstelleden Ergebnisse lieferen. Wenn man nämlich das Programm in einem Script laufen lässt, dann sind die Zeiten von zwei läufen oft gleich. wie denn das?

Coda
2007-08-20, 19:25:31
Automatischer Start beim booten oder so, sonst fällt mir da nix ein. Und selbst dann wird sich die Startzeit kaum auf die Milisekunde gleich sein.

Coda
2007-08-20, 20:40:52
Für "echte" Zufallszahlen gibt es solche Hardwaremodule mit halbdurchlässigen Spiegeln, wo dann einzelne Lichteilchen über den Zufall entscheiden.
Es gibt da auch einfachere Methoden dafür. Z.B. kann man aus Benutzereingaben, Netzwerkaktivität usw. ausreichend viel Entropie bekommen um gute Zufallszahlen zu generieren.

rotalever
2007-08-20, 21:18:54
Es gibt da auch einfachere Methoden dafür. Z.B. kann man aus Benutzereingaben, Netzwerkaktivität usw. ausreichend viel Entropie bekommen um gute Zufallszahlen zu generieren.
Natürlich, es gibt ja auch diese eine Internetseite wo man Zufallszahlen herbekommt. Für die meisten Zwecke wird es aber dabei bleiben, dass der eingebaute Pseudozufallsgenerator sehr sehr gut geeignet ist. Nur für Sachen wie Verschlüsselung sollte man sich mehr Gedanken machen.
In allen anderen Gebieten ist es i.d.R. so, dass es vor allem darauf ankommt, dass man gleichmäßig verteilte Zahlen hat.

Gast
2007-08-21, 16:41:52
rand() ist wohl ein kleiner nazi... tsts...

rotalever
2007-08-21, 17:27:28
rand() ist wohl ein kleiner nazi... tsts...
Why?

ollix
2007-08-21, 17:47:10
88 wird unter Neonazis als getarnter Hitlergruß verwendet, weil dieser verboten ist: Der achte Buchstabe des Alphabets ist das H; die 88 steht somit für HH, woraus sich „Heil Hitler“ ergibt.
Quelle: Wiki
Was hier aber nicht wirklich was zu suchen hat.

Wie ist es denn ansonsten mit den Zufallsgeneratoren in Hardware? Meine mal gelesen zu haben, daß da idR. irgendwelches "elektronisches Rauschen" in der Schaltung gemessen wird um für ausreichend Zufall zu sorgen.

Coda
2007-08-21, 17:51:32
Ja, das ist sehr üblich. Z.B. macht das die Kryptoengine von Suns T2 so.