C++ Zufallszahlen generieren ( Immer gleiche Zahlen )

Aixx

Ensign
Registriert
Sep. 2011
Beiträge
239
Morgen,

ich bin gerade dabei ein Programm für Zufallszahlen zu generieren.

von 1-49

Leider wirft das aktuelle Programm eigentlich immer die gleichen Zahlen aus.
Es ist eigentlich IMMER eine 17,48,1,33 dabei. Aber mal ist es z1,z2 usw.

Vielleicht gibt es ja sogar eine Möglichkeit dies zu vereinfachen.

Habe irgendwo gelesen das die Funktion in CPP nicht sogut funktionieren soll mit den Zufallswerten.

Danke für jede Hilfe.



Code:
#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;
int main()
{
int z1,z2,z3,z4,z5,z6;   // Variablen für sechs Zufallszahlen

srand(static_cast<unsigned>(time(0)));

//srand((unsigned)time(NULL));     Hatte ich vorher. Keine Besserung

z1 = rand() & 49;
z2 = rand() & 49;
z3 = rand() & 49;
z4 = rand() & 49;
z5 = rand() & 49;
z6 = rand() & 49;

// Falls wie unten zu sehen die Zahlen identisch sind ein Jump To Punkt für neue Zahlen
NEU1:
{z1 = rand() & 49;}
NEU2:
{z2 = rand() & 49;}
NEU3:
{z3 = rand() & 49;}
NEU4:
{z4 = rand() & 49;}
NEU5:
{z5 = rand() & 49;}
NEU6:
{z6 = rand() & 49;}

// Hier die IF Funktion damit keine gleichen Zahlen ausgegeben werden.
if ((((((z1 == z2) || (z1 == z3) || (z1 == z4) || (z1 == z5) || (z1== z6))))))
{goto NEU1;}
if ((((((z2 == z1) || (z2 == z3) || (z2 == z4) || (z2 == z5) || (z2== z6))))))
{goto NEU2;}
if ((((((z3 == z1) || (z3 == z2) || (z3 == z4) || (z3 == z5) || (z3== z6))))))
{goto NEU3;}
if ((((((z4 == z1) || (z4 == z2) || (z4 == z3) || (z4 == z5) || (z4== z6))))))
{goto NEU4;}
if ((((((z5 == z1) || (z5 == z2) || (z5 == z3) || (z5 == z4) || (z5== z6))))))
{goto NEU5;}
if ((((((z6 == z1) || (z6 == z2) || (z6 == z3) || (z6 == z4) || (z6== z5))))))
{goto NEU6;}

// Damit keine Zahl 0 ist.
if (z1==0)
{goto NEU1;}
if (z2==0)
{goto NEU2;}
if (z3==0)
{goto NEU3;}
if (z4==0)
{goto NEU4;}
if (z5==0)
{goto NEU5;}
if (z6==0)
{goto NEU6;}

cout << z1 << endl;
cout << z2 << endl;
cout << z3 << endl;
cout << z4 << endl;
cout << z5 << endl;
cout << z6 << endl;

system ("Pause");
return 0;
}
 
ich glaube das problem von rand() ist das es die zufallszahl aus dem programmzählerher generiert und da er ja immer an der gleiche stelle ist wenn er rand ausführt gibt es auch immer die gleiche zufallszahl

aber sicher bin ich mir nicht
 
rand() funktioniert tadellos.

Das Problem ist das & 49. Ersetz das mal gegen % 49.
49 hat gerade mal 3 Bits zu eins: Das 0te, 4te und 5te. Und da du ein Bit-UND darauf ausführst, wirst du also nur Zahlen bekommen, bei denen höchstens diese Bits gesetzt sind. 0->1, 4->16, 5->32, das die von dir genannten Zahlen deswegen rauskommen ist kein Wunder. Mit drei Bits (2^3=8), wirst du also acht unterschiedliche Zahlen bekommen. Da du die Null noch ausschließt, sinds sogar nur sieben.
 
Ich weis zwar nicht was an der rand() auszusetzen gibt, aber dein Code ist schon sehr umstaendlich geschrieben. Meine Loesung ist zwar auch nicht die eleganteste (und auch nicht direkt getestet), aber ich haette folgendes vorgeschlagen:
Code:
#include <cstdlib>
#include <iostream>
#include <ctime>

using namespace std;
int main(){
    int z1,z2,z3,z4,z5,z6; // Variablen für sechs Zufallszahlen

	while(z1==z2 || z1 ==z3 || z1==z4 || z1==z5 || z1==z6
		|| z2==z3 || z2==z4 || z2==z5 || z2==z6
		|| z3==z4 || z3==z5 ||z3==z6
		|| z4==z5 || z4==z6
		|| z5==z6){
		z1 = rand()%49 + 1;
		z2 = rand()%49 + 1;
		z3 = rand()%49 + 1;
		z4 = rand()%49 + 1;
		z5 = rand()%49 + 1;
		z6 = rand()%49 + 1;
	}
     
    cout << z1 << endl;
    cout << z2 << endl;
    cout << z3 << endl;
    cout << z4 << endl;
    cout << z5 << endl;
    cout << z6 << endl;
     
    system ("Pause");
    return 0;
}
 
Danke dir geisterfahrer hat wunderbar funktioniert.

Könntest du vielleicht kurz erklären was & und % genau aussagen ? Und welche Alternative es da noch gibt ?

edit : Danke distrophik für den Code .. Bin auch immer am rumtesten den Programmcode so kurz wie möglich zu halten. Nur bin ich noch relativ am anfang. Danke
 
Zuletzt bearbeitet:
Bit UND bedeutet, das wenn du damit zwei Variablen verknüpfst, im Ergebnis nur die Bits 1 sind, die in beiden Variablen gesetzt waren. Bei Variable 1 & Variable2:
0011 Variable 1 (dezimal: 3)
0101 Variable 2 (dezimal: 5)
0001 Ergebnis (dezimal: 1)
Da wie gesagt 49 nur drei Bits zu eins hat, kann das Ergebnis mit &49 auch nur maximal drei Bits gesetzt haben. Das Ergebnis war also xx000x, mit x=1 oder 0. Damit hattest du zwar dafür gesorgt das keine Zahlen größer 49 ausgeschlossen, aber eben auch sehr viele andere Zahlen. Dein Plan damit einen Dezimalzahlenbereich damit festzulegen würde nur funktionieren, wenn die Zahlenbereichsgrenze irgendwas in der Form (2^x)-1 wäre.

Bei % (Modulo) wird der Rest der ganzahligen Division angegeben: 52 % 49 = 2. Es muss übrigens var %49 + 1 heißen, hatte vorhin das +1 vergessen, denn der Rest von 49/49 ist bekanntlich 0, so das du niemals 49 erhalten würdest. Die Null ist auf die Weise auch gleich ausgeschlossen, so das du dir das Prüfen darauf auch sparen kannst (Der Rest ist nie negativ, da du dann +1 rechnest, ist das ganze also immer mindestens 1). Jedenfalls kann man so elegant mit dieser Rechenoperation den Zahlenbereich eingeschränken, denn der Rest einer Division kann ja nie größer werden als der Divisor, deswegen eben im Zusammenhang um den Wertebereich für Zufallszahlen festzulegen gerne genommen.
Für ausführlichere Erklärungen der Operatoren: Steht in jedem C/C++ Programmierbuch.
 
hier noch eine Lösung, welche das Gleiche wie die Lösung von geisterfahrer macht, dabei aber die Möglichkeiten von C++ mehr nutzt. Die Umwandlung des set<int> in vector<int> erfolgt aus Bequemlichkeit, da der Zugriff mittels Index( tip[0]..tip[5]) möglich ist.

Code:
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <set>
#include <vector>

using namespace std;

int main() {
    srand(static_cast<unsigned int>(time(0)));

    set<int> s;
    while(s.size() != 6) {
        s.insert(1+rand() % 49);
    }
    vector<int> tip(s.begin(), s.end());

    for(int i=0, i_end=tip.size(); i!=i_end; ++i)
        cout << tip[i] << ", ";
    cout << "\n";
    return 0;
}
 

Ähnliche Themen

Zurück
Oben