BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Zufallsgenerator » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Zufallsgenerator
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
DJ-Paddel DJ-Paddel ist männlich
Junior Member


images/avatars/avatar-618.jpg

Dabei seit: 21.10.2001
Beiträge: 142

Zufallsgenerator       Zum Anfang der Seite springen

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

__________________
großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen
Laß Dir unsere Kinder als Lehre dienen, Peg! Beim
Sex kann nichts Gutes rauskommen!!!"
großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen
15.05.2003 22:39 DJ-Paddel ist offline E-Mail an DJ-Paddel senden Beiträge von DJ-Paddel suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

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.
16.05.2003 01:46 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
Zirias Zirias ist männlich
BlackBoarder


images/avatars/avatar-450.jpg

Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom

      Zum Anfang der Seite springen

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

__________________
palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Zirias: 16.05.2003 02:35.

16.05.2003 02:33 Zirias ist offline Homepage von Zirias Beiträge von Zirias suchen
DJ-Paddel DJ-Paddel ist männlich
Junior Member


images/avatars/avatar-618.jpg

Dabei seit: 21.10.2001
Beiträge: 142

Themenstarter Thema begonnen von DJ-Paddel
      Zum Anfang der Seite springen

Besten Dank!

Habe jetzt meine Funktion fertig!!!!

CYA BY DJ Paddel

__________________
großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen
Laß Dir unsere Kinder als Lehre dienen, Peg! Beim
Sex kann nichts Gutes rauskommen!!!"
großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen großes Grinsen
16.05.2003 06:52 DJ-Paddel ist offline E-Mail an DJ-Paddel senden Beiträge von DJ-Paddel suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

@ 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?
16.05.2003 11:56 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
Zirias Zirias ist männlich
BlackBoarder


images/avatars/avatar-450.jpg

Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom

      Zum Anfang der Seite springen

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

__________________
palmen-it.de
GCS/MU d+(++) s+: a C++ UL++++ P+++$ L+++ !E W+++ N+ o? K? w++$ !O M-- V?
PS+ PE++ Y+ PGP++ t !5 X- R- tv b+ DI++ D+ G e++ h r y+
16.05.2003 15:53 Zirias ist offline Homepage von Zirias Beiträge von Zirias suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » Zufallsgenerator

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH