Randomize-Problem
-
Hallo,
Ich möchte mit Hilfe von Randomize und random in meinem Programm-Zufallswerte erstellen.
Das Problem ist: Die über random generierten Zufallswerte sind immer gleich. Es sollen insgesamt 5 Zufallszahlen aus einem Zahlenbereich der in der Regel(es kann leichte Abweichungen nach uten oder oben geben) zwischen 0 und 20 liegt. Ich habe den Zufallsgenerator zunächst mit Randomize() initialisiert und gerneriere dann später mit
random(MaximaleZufallszahl) die Zufallszahl. Aber es kommen immer die genau gleichen Zahlen raus. Ich hab auch schon hier im Forum gelesen das man statt Randomize() die procedure randomize() - mit kleinem r - verwenden soll, weil Randomize() einen Bug hat. Aber auch bei randomize() erhalte ich immer die genau gleichen Zufallszahlen. Kann mir jemand einen tipp geben, was ich falsch mache?Danke & LG Seddto
-
dann mach es doch ganz einfach schreib dir z.b
5Randomize zahlen und nach
1Randomize * 2Randomize / 3Randomize /2Randomize +23
und du bekommst ne Zahl die nicht immer gleich ist ....
verstehst du was ich meine ??
-
ähh nöö, nicht wirklich. Aber es muß doch einen Grund haben das Randomize nicht geht. Hat wirklich noch nie jemand dieses Problem gehabt und kann helfen?
-
ich meien ich hatte das Problem auch ich hab mir damals so geholfen.
a=random(Edit1->Text.ToInt())+3; b=random(Edit2->Text.ToInt())+5; c=a+b-a+b+b-a+b+b-2-9+88-44+2+8+23+84-28; Label1->Caption=c;
-
randomize(); int zahl = random(20);Das gibt immer verschiedene Zahlen aus, also wo liegt das Problem?

-
Aber wenn random immer die gleichen Zahlen liefert dürfte dein Codeschnipsel ja auch nicht helfen weil dort ja mit feststehenden Zahlen gearbeitet wird oder sehe ich das falsch? Außerdem muss es beim C++Builder doch die Möglichkeit geben Zufallszahlen zu generieren ohne so eine komplizierte Konstruktion. Gibt es da vielleicht noch andere Möglichkeiten außer randomize() +random()?
Lg Seddto

-
@nichteingeloggt
Nein leider bei mir eben nicht! randomize() habe ich in FormCreate aufgerufen, wird also aufjedenfall ausgeführt. Dann möchte ich mit Random zufällig ein Element aus einer Datenbank auswählen, in diesem Fall aus einer TTable-Kompo.
Also schreibe ichint RecordNummer = random(Form1->Table2->RecordCount);Die zurück gelieferten Zahlen sind immer gleich. In der TTable-Kompo sind etwa 15 Einträge drin.
-
Also der Schnipsel gibt mit jedem neuen Aufruf eine andere Zahl (oder mit naturgemäßer geringer Wahrscheinlichkeit, die selbe Zahl) aus.
Was möchtest du denn? Sollen die 5 Zahlen immer und auf jeden Fall verschieden sein?
Dann musst du dir die bereits zufallsgenerierten Zahlen merken, und sicher stellen das diese nicht nochmal "ausgewürfelt" werden.
-
Vielleicht hilkft der Code den ich unter:
http://www.c-plusplus.net/forum/viewtopic.php?t=86225 geposted habe dir.
-
@nichteingeloggt
Nein leider bei mir eben nicht! randomize() habe ich in FormCreate aufgerufen, wird also aufjedenfall ausgeführt. Dann möchte ich mit Random zufällig ein Element aus einer Datenbank auswählen, in diesem Fall aus einer TTable-Kompo.
Also schreibe ichint RecordNummer = random(Form1->Table2->RecordCount);Die zurück gelieferten Zahlen sind immer gleich. In der TTable-Kompo sind etwa 15 Einträge drin.
-
seddto schrieb:
int RecordNummer = random(Form1->Table2->RecordCount);Die zurück gelieferten Zahlen sind immer gleich. In der TTable-Kompo sind etwa 15 Einträge drin.
Merkwürdig, das sollte nicht sein. Pack doch mal den RecordCount in eine integer Variable, und arbeite damit. Obwohl das eigentlich keinen Unterschied machen sollte...
-
@sedto: Ich habs eben mal kurz nachprogrammiert, ich bekomme immer ein zufälliges Element aus der Datenbank.
deshalb wundert mich das, dass du immer nur die selbe Zahl zurückgeliefert bekommst...
-
Ich hatte mal ein Problem auf die schnelle 40 6-stellige numerische Strings zu erzeugen.
Mit randomize hab ich mir auch die Ohren gebrochen. Der Zeitfaktor spielt eine gewisse Rolle dabei. Da Du das im create aufrufst ist die Zeit fast immer gleich.Ich hab das ganze mal so geschrieben und recht zufällige Ergebnisse bekommen:
double n=Now(); // Start=Now() definiere ich irgentwo im Programm, es soll ja bis zur Ausführung dieser Zeile Zeit vergehen double w=n-Start; String x=(String)w; // nen möglichst wirrer integer int fak=(x.SubString(4,1)+x.SubString(7,1)+x.SubString(6,1)).ToInt(); // initialiserung des Zufallsgerenator mit nem aneren wirren integer; srand((x.SubString(3,1)+x.SubString(7,1)+x.SubString(5,1)).ToInt()); String TAN[40]; for (int i=0;i<=39;i++) { String tmp=TANLen(IntToStr(rand()*fak)); //TANLen überprüft nur auf Länge der Strings for (int j=1;j<=i;j++) { if (tmp==TAN[i-1]) //doppelte nicht zulassen i--; } TAN[i]=tmp; Memo1->Lines->Add(tmp); }Vielleicht hilfts ja...