|
|
|
|
Zufallsgenerator |
DJ-Paddel
Junior Member
Dabei seit: 21.10.2001
Beiträge: 142
|
|
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
__________________
Laß Dir unsere Kinder als Lehre dienen, Peg! Beim
Sex kann nichts Gutes rauskommen!!!"
|
|
15.05.2003 22:39 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
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 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
|
|
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?
radomize() gibts in der libc nicht und srand() hat er ja gemacht, dummerweise eben zweimal und sehr wahrscheinlich mit demselben Wert
__________________ 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 |
|
|
DJ-Paddel
Junior Member
Dabei seit: 21.10.2001
Beiträge: 142
Themenstarter
|
|
Besten Dank!
Habe jetzt meine Funktion fertig!!!!
CYA BY DJ Paddel
__________________
Laß Dir unsere Kinder als Lehre dienen, Peg! Beim
Sex kann nichts Gutes rauskommen!!!"
|
|
16.05.2003 06:52 |
|
|
Compuholic
knows where he wants to go tomorrow
Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München
|
|
@ 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 |
|
|
Zirias
BlackBoarder
Dabei seit: 11.09.2002
Beiträge: 1.217
Herkunft: /dev/urandom
|
|
Ich finde die Rueckgabe des kompletten Arrays entspricht eher der Natur der Funktion
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
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 |
|
|
|
|
|
|