PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zufallszahlen wiederholen sich


Unregistered
2003-04-21, 19:20:50
Hi ,
als erstes lese ich in meinem Programm die Zufallszahlen ein.
for (int i=0;i<7;i++)
{
zufallszahlen[i]=random(49)+1;
memaus->Lines->Add(AnsiString(zufallszahlen[i]));
}
Ich habe festgestellt , dass sich diese wiederholen.Ich habe bislang keine gute Methode programmiert , in der die doppelten Zufallzahlen rausfliegen und neue genohmen werden und nochmal verglichen und wenn wieder eine Zufallszahlen doppelt wird wieder eine neue Zufallszahl gezogen.
Meine Idee bis jetzt:
int x=0;
int zahll=0;
int zahler2=1;
int x2=0;
while (x==0)
{

if (zahler2==7)
{
zahler2=0;
zahl1++;
if (zahl1==6)
{
zahl1=0;
if (x2==0)
{
x=1;
}
}
}
if (zufallszahlen[zahl1]==zufallszahlen[zahler2])
{
zufallszahlen[zahl1]=random(49)+1;
x2=1;
}

if (zufallszahlen[zahl1]!=zufallszahlen[zahler2])
{
zufallszahlen[zahl1]=random(49)+1;
x2=0;
}
Wobei wenn ich mir hier auch klar ist, dass wenn die letzte Zufallszahl unter Umständen,wenn die letzte Zahl nicht doppelt vorkommt trotzdem die while Schleife beendet. Wie kann ich das Problem geschickt lösen?

stabilo_boss13
2003-04-21, 19:42:13
Schreibe doch den Test, ob deine Zahl schon vorkommt in eine Funktion:

bool function number_exists(int number)
{
for (int x=0;x<7;x++)
{
if (zufallszahlen[x]==number)
return(true);
}
return(false)
}

Dann brauchst du im Hauptprogramm nur noch eine Schleife:

for (int i=0;i<7;i++)
{
zufallszahlen[i]=random(49)+1;
while (number_exists(zufallszahlen[i])
{
zufallszahlen[i]=random(49)+1;
}
memaus->Lines->Add(AnsiString(zufallszahlen[i]));
}


Man kann das sicher noch eleganter machen, aber zur Erklärung sollte es reichen.

Außerdem solltest du den Zufallsgenerator mit einer Zeitfunktion immer neu starten, sonst erhältst du bei jedem Programmlauf identische Lottozahlen.

mutzel
2003-04-21, 19:51:00
du solltest bevor du den befehl random() benutzt einmal randomize() aufrufen sonst kommen bei jedem neustart des programms die selben randomzahlen raus

EDIT: ups .. das hat stabilo_boss13 auch schon geschrieben .. sorry :stareup:

Unregistered
2003-04-21, 20:55:01
ich habe randomize natürlich schon vorher aufgerufen, aber da ich nicht den gesamten Quelltext gepostet habe , konntet ihr das nicht wissen. Ansonsten klappt die Lösung von stabilo_boss13 nicht richtig , da eine Endlosschleife entsteht.

stabilo_boss13
2003-04-22, 09:16:44
OK!
Hier nochmal der lauffähige Code. So ist das halt, wenn man das ohne Compiler aus dem Kopf machen muss.
In der Funktion number_exists darf man natürlich die zuletzt erzeugte Zufallszahl selber nicht mehr prüfen.

#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int zufallszahlen[10];

bool number_exists(int number, int self)
{
for (int x=0;x<7;x++)
{
if (!(x==self))
{
if (zufallszahlen[x]==number)
return(true);
}
}
return(false);
}

int main(int argc, char *argv[])
{
srand( (unsigned int)time( NULL ) );

for (int i=0;i<7;i++)
{
zufallszahlen[i]=rand();
while (number_exists(zufallszahlen[i],i))
{
zufallszahlen[i]=rand();
}
cout << zufallszahlen[i] << endl;
}
}

mutzel
2003-04-22, 09:35:47
edit: weg

Unregistered
2003-04-22, 09:50:16
Doppelte Zahlen kommen nun nicht mehr vor , aber wie schon mutzel gesagt hat, kommt ein falsche Zahl trotzdem random(48)+1 raus , wie z.B 13155.Aber trotzdem schonmal thx für deine Antworten.

mutzel
2003-04-22, 09:58:24
hab da oben was falschen gepostet ...
also ich habs nochma ausgetestet ... wenn man es so macht wie oben gehts wunderbar .. ich hatte halt nur vergesen eine zahl bei meiner aenderung anzupassen



#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int zufallszahlen[20],
count=20, // anzahl der zufallszahlen
bereich=20; // bereich der zufalls zahlen

bool number_exists(int number, int self)
{
for (int x=0;x<count;x++)
{
if (!(x==self))
{
if (zufallszahlen[x]==number)
return(true);
}
}
return(false);
}

int main(int argc, char *argv[])
{
randomize();

for (int i=0;i<count;i++)
{
zufallszahlen[i]=random(bereich);
while (number_exists(zufallszahlen[i],i))
{
zufallszahlen[i]=random(bereich);
}
cout << zufallszahlen[i] << endl;
}
getchar();
}

Unregistered
2003-04-22, 10:34:30
Es klappt jetzt auch bei mir.

Frank
2003-04-28, 19:37:43
Wenn du willst poste ich auch einige Methoden wie man Pseudozufallszahlen erzeugt, die als solche von echten Zufallszahlen nicht unterscheidbar sind - ohne einfluss der Zeit oder so. Rein mathematisch. :D :D

Unregistered
2003-04-29, 17:57:36
jo poste diese Methoden mal bitte.Bin gespannt, wie man das ohne einfluss der Zeit schaffen kann.

mutzel
2003-04-29, 18:00:48
wie will man eine rein mathematische zufalls funktion bauen .. wenn in der mathematik eigendlich so rein garnix zufall ist ...

Frank
2003-04-29, 19:30:49
http://rcswww.urz.tu-dresden.de/~fh468638/temp/zufallma.gif
oder anders ausgedrückt:
ob du die Zahlen vom Generator nimmst oder ne Münze wirfst: nicht unterscheidbar.

Xmas
2003-04-29, 20:51:43
Originally posted by Frank
oder anders ausgedrückt:
ob du die Zahlen vom Generator nimmst oder ne Münze wirfst: nicht unterscheidbar.
Dafür braucht man dann aber auch Integer > 1024 Bit...

Frank
2003-04-29, 22:00:20
Originally posted by Xmas
Dafür braucht man dann aber auch Integer > 1024 Bit...
und?

Das tut doch der Praxis keinen Abbruch.

Vedek Bareil
2003-05-01, 18:26:06
Originally posted by Frank
Das tut doch der Praxis keinen Abbruch. doch. In der Praxis hast du auf dem Rechner nämlich für gewöhnlich nur 32 Bit Integers zur Verfügung ;)

Frank
2003-05-01, 23:45:29
ach darauf wollt ihr hinaus. Bei den Bereich geht auch Fortran langsam die Puste aus. Aber kann man sich da nich selbst ein Modul/Klasse für schreiben?

Oder alles easy und speziell dafür Maple oder Co anwerfen.

liquid
2003-05-02, 13:07:16
Für solch lange Integer könnte man doch GMP benutzen, oder?
Link (http://www.swox.com/gmp/)

cya
liquid