zufallszahlen erstellen

Nemesis

Nemesis

N3RD
hi,
ich habe beschlossen mir c beizubringen, und habe auch gleich das erste problem:

ich möchte ein programm schreiben, welches mir 6 zahlen von 1 bis 49 zurück giebt.

was ich bislang vollbracht habe ist folgendes:
Code:
# include <time.h>
# include <stdio.h>
# include <stdlib.h>

int main (void)
        {
                srand(time(NULL));
                int i;
                for (i = 1; i < 7; i++)
                        {
                                printf("%d. Zahl: %e\n", i, (rand()%49));
                        }
                return 0;
        }

aber irgendwie will das nicht funktionieren, er gibt mir zwar 6 zahlen, aber jenseits von 49:
Code:
1. Zahl: 4.853247e-270
2. Zahl: 4.853247e-270
3. Zahl: 4.853247e-270
4. Zahl: 4.853247e-270
5. Zahl: 4.853247e-270
6. Zahl: 4.853247e-270

aber ich finde den fehler nicht, warum gibt er mir da solch komische zahlen aus?

thx
 
Die Funktion rand() liefert einen Wert zwischen 0 und RAND_MAX.
also z.B.
Code:
printf("%d. Zahl: %d\n", i, (int) (1+(49.0*rand()/(RAND_MAX+1.0))) );
ps: ich glaube das mit dem srand() stimmt auch noch nicht so.
 
Doch, doch srand() ist schon wichtig. sonst bekommst du vermutlich immer die gleiche Zahl raus. Und time(0) ist auch soweit korrekt.
 
du solltest den bereich von rand eingrenzen :-)
 
ok, ich habs jetzt mal folgendermasen:
Code:
# include <time.h>
# include <stdio.h>
# include <stdlib.h>


int main(void)
	{
		int i = 0;
		srand(time(NULL));
		for(i=1; i<7; i++)
		printf("%i\n", rand() % (49 - 1 + 1) + 1);
		return 0;
	}
das funktioniert auch, er gibt mir jetzt 6 zahlen in dem bereich aus, nur ist das nicht "mit der faust von hinten durch den rücken in den mund" ?
 
Nemesis schrieb:
das funktioniert auch, er gibt mir jetzt 6 zahlen in dem bereich aus, nur ist das nicht "mit der faust von hinten durch den rücken in den mund" ?
Da du ja C lernen willst, kannst du jetzt ja eine Funktion schreiben, die dir das vereinfacht ;)
 
man 3 rand schrieb:
In Numerical Recipes in C: The Art of Scientific Computing (William H.
Press, Brian P. Flannery, Saul A. Teukolsky, William T. Vetterling; New
York: Cambridge University Press, 1992 (2nd ed., p. 277)), the follow-
ing comments are made:
"If you want to generate a random integer between 1 and 10, you
should always do it by using high-order bits, as in

j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

and never by anything resembling

j = 1 + (rand() % 10);

(which uses lower-order bits)."
hätte auch geholfen.
 
einfach nur ein buchstabe falsch, und jetzt tuts *freut-sich-wie-ein-schneekönig*

thx :)

edit:

so, jetzt hab ich es noch in eine etwas anschaulichere version gebracht:

Code:
# include <time.h>
# include <stdio.h>
# include <stdlib.h>

int main (void)
        {
                srand(time(NULL));
                int j, i, x;
                printf("Bitte die Anzahl der gewünschten Reihen angeben: ");
                	scanf("%d", &x);
                for (j = 1; j < (x+1); j++)
                	{
                		for (i = 1; i < 7; i++)
                        	{
                                if (i < 6)
                                	if (i == 1)
                                		printf("%d. Reihe: %d;", j, (rand()%49));
                                	else
                                		printf(" %d;", (rand()%49));
                                else
                                	printf(" %d\n", (rand()%49));
                        	}
                	}
                return 0;
        }

gibt es nun auch einen weg, dass er mir keine zahlen in einer reihe doppelt ausgiebt, ohne dass ich die zahlen in einer variablen abspeichere und dann die variablen vergleichen lasse?

thx
 
Zuletzt bearbeitet:
Du kannst dir ja nen Array mit allen Zahlen von 1 bis 49 erstellen ...
und dann den Index als Zufallszahl berechnen lassen .. die entsprechende Zahl ausgeben,
diese Zahl aus dem Array löschen (evtl. gleich ne Liste nehmen ...)
und das ganze spiel nochmal, nur das die Zahl der Indizes jetzt eins weniger ist ...

Bestimmt ziemlich ineffizient ... aber gut um zu lernen oder so ;-)
 
MTS schrieb:
Du kannst dir ja nen Array mit allen Zahlen von 1 bis 49 erstellen ...
Bestimmt ziemlich ineffizient ... aber gut um zu lernen oder so ;-)
Wie wär es mit Folgendem?
Code:
bool zahlen[49];
:devil:

Gruß Karru

(ps: Auch wenn sich das kleinlich anhört, es schreibt sich "gibt" nicht "giebt".)
 
MTS schrieb:
Du kannst dir ja nen Array mit allen Zahlen von 1 bis 49 erstellen ...
und dann den Index als Zufallszahl berechnen lassen .. die entsprechende Zahl ausgeben,
diese Zahl aus dem Array löschen (evtl. gleich ne Liste nehmen ...)
und das ganze spiel nochmal, nur das die Zahl der Indizes jetzt eins weniger ist ...

Bestimmt ziemlich ineffizient ... aber gut um zu lernen oder so ;-)
Ein effizienterer Weg ist es, das Array zu erzeugen und dann in einer weiteren Schleife den Index der Laufvariable mit einer Zufallszahl 0<=r<49 zu vertauschen. Danach nimmt man die ersten k Zahlen des arrays, die dann gut durchmischt sein sollten.
 
so, jetzt hab ich mich mal in die arrays etwas eingearbeitet, das mit dem bool war auch keine dumme idee ;), und folgende lösung kam dabei raus :) :

Code:
#include <iostream>
#include <stdlib.h>
using namespace std;

int main()
{
	int lotto[6];	// array mit 6 variablen
	int i, j;
	bool neueZahl;

	srand(0);		// initialisierung zufallszahlen

	for(i=0; i<6; i++)	// zieht nacheinander 6 zufallszahlen
	{
		do	//Wiederhole die ziehung so lange bis die zahlen unterschiedlich sind
		{
			lotto[i] = rand() % 49 +1;	//erstellt zufallszahlen
			neueZahl = true;			//positive grundeinstellung
			for (j=0; j<i; j++)		//durchlaufe alle bisher gezogenen kugeln
			{
				if (lotto[j]==lotto[i])	//hier werden doppelte entdeckt
				{
					neueZahl = false;
				}
			}
			
		} while ( neueZahl == 0); 	//Bedingung neueZahl muss 0 sein, was der fall ist, wenn alle zahlen unterschiedlich sind
	}

	for (i=1; i<7; i++)
	{
		cout << i << ". Zahl: " << lotto[i] << "\n";
	}
	cout << endl;
}

EDIT:

so, habe noch etwas dran rumgespielt:

Code:
#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
	int i, j, k, l, x;
	printf("Bitte die Anzahl der gewünschten Reihen angeben: ");
	scanf("%d", &x);
	
	int lotto[6];	// array mit 6 variablen
	bool neueZahl;

	srand(0);		// initialisierung zufallszahlen

		for (l = 1; l < (x+1); l++)	//erstellt gewünschte reihen
		{
			printf("%d. Reihe:\n", l);	//gibt die Reihen-Nr. an
			for(i=0; i<6; i++)	// zieht nacheinander 6 zufallszahlen
			{
				do	//Wiederhole die ziehung so lange bis die zahlen unterschiedlich sind
				{
					lotto[i] = rand() % 49 +1;	//erstellt zufallszahlen
					neueZahl = true;			//positive grundeinstellung
					for (j=0; j<i; j++)		//durchlaufe alle bisher gezogenen kugeln
					{
						if (lotto[j]==lotto[i])	//hier werden doppelte entdeckt
						{
							neueZahl = false;
						}
					}
			
				} 
				
				while ( neueZahl == 0); 	//Bedingung neueZahl muss 0 sein, was der fall ist, wenn alle zahlen unterschiedlich sind
			}
				 

			for (i=1; i<7; i++)
			{
				cout << "  " << i << ". Zahl: " << lotto[i] << "\n"; 	//gibt die Zahlen aus
			}
			
			cout << endl;
	

		}
		
		getchar();
		if( getchar() != '\n' )		//Warte auf enter taste um programm zu beenden
			{ return 0; }
}

nur ist nun die 6. zahl imer die zahl, welche man eingab auf die frage wieviel reihen er generieren solle. aber ich finde den fehler nicht, er speichert doch die anzahl der reihen in der variablen x und die zahlem im array lotto.
kann mir da jemand bei der fehlersuche behilflich sein?

thx
 
Zuletzt bearbeitet:

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Probleme mit srand()

Aufgabe in C

[C] Speicherzugriffsfehler mit malloc

Zurück
Oben