BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- Zufallsgenerator (http://www.black-board.net/thread.php?threadid=12024)


Geschrieben von DJ-Paddel am 15.05.2003 um 22:39:

  Zufallsgenerator

Moin Moin!!!

Habe mal ne frage ist echt wichtig!!!

Also wir sollen in c eine Lotto Ziehung programmieren mit 6 aus 49!
Ich habe auch eine Funktion fertig aber wenn ich die funktion ein zweites mal aufrufe bekomme ich wieder die gleich zahlen woran könnte das liegen???

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
ziehe(int *);

int main() {
	int ziehungA[7];
	int ziehungB[7];
	int i;
	short int a,b;
	ziehungA;

	ziehe(ziehungA);

	printf("Ziehung A\n");
	for(i=0;i<6;i++) {
		printf("Die Zufallszahl lautet %d\n",ziehungA[i]);
	}

	ziehe(ziehungB);

	printf("\nZiehung B\n");
	for(i=0;i<6;i++) {
		printf("Die Zufallszahl lautet %d\n",ziehungB[i]);
	}


return(0);
}

//------------------------Zufallsgenerator für Lottozahlen---------------
ziehe(int *ziehen) {
	int temp[6]={0,0,0,0,0,0};
	int i,fertig=0;
	srand(time(NULL));

	do{
	for(i=0;i<6;i++) {
		temp[i]=(rand()%49+1);
	}
	if((temp[0]!=temp[1])&&(temp[0]!=temp[2])&&(temp[0]!=temp[3])&&(temp[0]!=temp[4])&&(temp[0]!=temp[5])){
		ziehen[0]=temp[0];
		fertig=1;
	}else{
		temp[0]=(rand()%49+1);
			if((temp[0]!=temp[1])&&(temp[0]!=temp[2])&&(temp[0]!=temp[3])&&(temp[0]!=temp[4])&&(temp[0]!=temp[5])){
				ziehen[0]=temp[0];
				fertig=1;
	}		}
	if((temp[1]!=temp[0])&&(temp[1]!=temp[2])&&(temp[1]!=temp[3])&&(temp[1]!=temp[4])&&(temp[1]!=temp[5])){
		ziehen[1]=temp[1];
		fertig=2;
	}else{
		temp[1]=(rand()%49+1);
			if((temp[1]!=temp[0])&&(temp[1]!=temp[2])&&(temp[1]!=temp[3])&&(temp[1]!=temp[4])&&(temp[1]!=temp[5])){
				ziehen[1]=temp[1];
				fertig=2;
	}		}
	if((temp[2]!=temp[0])&&(temp[2]!=temp[1])&&(temp[2]!=temp[3])&&(temp[2]!=temp[4])&&(temp[2]!=temp[5])){
		ziehen[2]=temp[2];
		fertig=2;
	}else{
		temp[2]=(rand()%49+1);
			if((temp[2]!=temp[0])&&(temp[2]!=temp[1])&&(temp[2]!=temp[3])&&(temp[2]!=temp[4])&&(temp[2]!=temp[5])){
				ziehen[2]=temp[2];
				fertig=2;
	}		}
	if((temp[3]!=temp[0])&&(temp[3]!=temp[2])&&(temp[3]!=temp[1])&&(temp[3]!=temp[4])&&(temp[3]!=temp[5])){
		ziehen[3]=temp[3];
		fertig=3;
	}else{
		temp[3]=(rand()%49+1);
			if((temp[3]!=temp[0])&&(temp[3]!=temp[2])&&(temp[3]!=temp[1])&&(temp[3]!=temp[4])&&(temp[3]!=temp[5])){
				ziehen[3]=temp[3];
				fertig=3;
	}		}
	if((temp[4]!=temp[0])&&(temp[4]!=temp[2])&&(temp[4]!=temp[3])&&(temp[4]!=temp[1])&&(temp[4]!=temp[5])){
		ziehen[4]=temp[4];
		fertig=4;
	}else{
		temp[4]=(rand()%49+1);
			if((temp[4]!=temp[0])&&(temp[4]!=temp[2])&&(temp[4]!=temp[3])&&(temp[4]!=temp[1])&&(temp[4]!=temp[5])){
				ziehen[4]=temp[4];
				fertig=4;
	}		}
	if((temp[5]!=temp[0])&&(temp[5]!=temp[2])&&(temp[5]!=temp[3])&&(temp[5]!=temp[4])&&(temp[5]!=temp[1])){
		ziehen[5]=temp[5];
		fertig=5;
	}else{
		temp[5]=(rand()%49+1);
			if((temp[5]!=temp[0])&&(temp[5]!=temp[2])&&(temp[5]!=temp[3])&&(temp[5]!=temp[4])&&(temp[5]!=temp[1])){
				ziehen[5]=temp[5];
				fertig=5;
	}		}
	}while(fertig!=5);
	return 0;
}


Wäre super wenn ichr mir schnell helfen könntet

THX BY DJ Paddel



Geschrieben von Compuholic am 16.05.2003 um 01:46:

 

Das liegt daran, das Zufallszahlen beim Computer niemals zufällig sind, sondern nur durch Algorithmen erzeugt werden, die kaum Regelmäßigkeiten erkennen lassen. Der Zufallsgenerator wird mit einem bestimmten Anfangswert initialisiert und generiert eine darauf basierende Zahlenfolge.

Dein Problem läßt sich also lösen, indem Du den Ausgangswert des Zufallsgenerators änderst. Das geht mit der Funktion randomize(). Diese setzt den Ausgangswert mit Hilfe der Systemuhr neu.

Also solltest du einmal mit randomize den Generator initialisieren. Danach kannst du mit random(int MaximalerWert); die Zufallszahlen abfragen. Der Rückgabewert von random ist eine Zahl zwischen 0 und MaximalerWert - 1.



Geschrieben von Zirias am 16.05.2003 um 02:33:

 

Der Fehler ist ganz klar: Du machst srand(time(NULL)) bei beiden Ziehungen, da time() aber nur Sekunden zurückgibt, ist es sehr wahrscheinlich, dass du auf diese Art den Zufallsgenerator zweimal mit demselben Wert initialisierst.
Überhaupt wirkt dein Programm unnötig umständlich, schau dir mal das hier an:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

uint8_t *ziehung;
uint8_t i;

uint8_t *zieh() {
  // Array fuer die gezogenen Zahlen:
  uint8_t *nums;
  // Array zur Markierung gezogener Zahlen:
  uint8_t temp[49]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  uint8_t x,i,j;

  for (i=0;i<6;i++) { // 6 Zahlen ziehen
    do x=rand()%49; while (temp[x]==1); // schon gezogen -> nochmal versuchen
    temp[x]=1; // als gezogen markieren
  }

  nums=(uint8_t*)malloc(6); // Platz fuer 6 Zahlen
  j=0;
  for (i=0;i<49;i++) // gezogene Zahlen uebertragen
    if (temp[i]==1) nums[j++]=i+1;

  return nums; // gezogene Zahlen zurueckgeben
}

int main() {

  srand(time(NULL)); // Zufallsgenerator initialisieren

  ziehung=zieh(); // Ziehung 1
  for (i=0;i<6;i++) printf("%d  ",ziehung[i]);
  printf("\n");
  free(ziehung); // Speicher freigeben

  ziehung=zieh(); // Ziehung 2
  for (i=0;i<6;i++) printf("%d  ",ziehung[i]);
  printf("\n");
  free(ziehung); // Speicher freigeben

  return 0;

}


Greets, Ziri

(BTW, gewöhne dir mal sauberes Einrücken an *g*)

Edit: Compuholic, kann das sein, dass du gerade gedanklich bei Pascal bist? Augenzwinkern radomize() gibts in der libc nicht und srand() hat er ja gemacht, dummerweise eben zweimal und sehr wahrscheinlich mit demselben Wert großes Grinsen



Geschrieben von DJ-Paddel am 16.05.2003 um 06:52:

 

Besten Dank!

Habe jetzt meine Funktion fertig!!!!

CYA BY DJ Paddel



Geschrieben von Compuholic am 16.05.2003 um 11:56:

 

@ Zirias:

Du hast Recht. War wohl gedanklich bei Pascal. (war btw. übrigens eine schöne Sprache) *g*

Was ich noch fragen wollte. Gehört das eigentlich zum guten Programmierstil. In einer Funktion Speicher zu allokieren, den man extra wieder freigeben muß (in einem extra Schritt meine ich).
Ich wollte bei einigen meiner Programme schon so etwas machen, habe aber immer davor zurückgeschreckt, weil ich die Lösung nicht als besonders elegant empfunden habe.

Ich hab das immer versucht so zu lösen. Ich definiere einen neuen Variablentyp (oder Struktur, je nachdem) und arbeite in der Funktion mit Pointern.

Was ist denn jetzt eigentlich die bessere Lösung?



Geschrieben von Zirias am 16.05.2003 um 15:53:

 

Ich finde die Rueckgabe des kompletten Arrays entspricht eher der Natur der Funktion smile Wird in Java auch nicht anders gemacht, allerdings hasse ich diese Sprache ja, unter anderem weil das blosse dereferenzieren genuegt, damit der Speicher wieder freigegeben wird.
Die Methode, der Funktion einfach einen Pointer zu geben, wo sie ihre Daten hinschreiben soll, ist allerdings weiter verbreitet, sie duerfte auch etwas performanter sein und sicherer vor Memory Leaks (dafuer riskiert man eher einen Buffer Overflow).
Man koennte auch kurz sagen "Geschmackssache". Bei groesseren Projekten, wo die Risiken von Memory Leaks resp. Buffer Overflows nicht mehr nur akademischer Natur sind, wird man sowieso objektorientiert programmieren Augenzwinkern

Greets, Ziri


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH