[c] Zufallsgenerator in Funktion wird aber nur einmal ausgeführt

titusfeuerkopf

Grünschnabel
Hallo

Schreibe ein Programm welches Lottozahlen(mehrere Tips) generieren soll.
Habe eine Funktion zufall angelegt, die den Zufallsgenerator enthält, diese soll in der Funktion fuellen aufgerufen werden und dort ein Array mit den Zahlen füllen. Mein Problem ist jetzt das immer die gleiche Zufallszahl ins Array geschrieben wird.

Das Ergebnis schaut dann so aus:

Ihre Lottozahlen lauten:
-----------------------------------
31 31 31 31 31 31
31 31 31 31 31 31
31 31 31 31 31 31
31 31 31 31 31 7800

Jemand einen Idee was ich falsch mache?

MfG

Titus

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

int zufall() // Erstellt eine Zufallszahl
  {
    int zahl;
	srand(time(0));
	zahl=1+rand()%45;
	return zahl;
  }

int fuellen(int x,int y) // Füllt das Array mit Zufallszahlen, unter zuhilfenahme der Funktion zufall
  {  
  int yn;
  int xn;
  int feld[x][y];
  for (yn=0;yn<y;yn++)
    {
	  for(xn=0;xn<x;xn++)
	  {
	    feld[xn][yn]=zufall();
	  }
	} 
  return(feld[x][y]); 
  }
  
  
//int sort() //Sortiert jeweils eine Zeile
//  {
//  
//  }

void ausgabe(int x,int y)
  {
  int yn;
  int xn;
  int feld[x][y];
  
  printf("Ihre Lottozahlen lauten:\n-----------------------------------\n");
  
  for (yn=0;yn<y;yn++)  
    {
	  for(xn=0;xn<x;xn++)
	    {
	      printf(" %d \t",feld[xn][yn]);
	    }
	  printf("\n");
	}
  }
  
int main ()
  {
    int x=4;	// 6 aus
	int a=45;	//	45
	int y=4;	// Anzahl der Tips
	int feld[x][y];
	fuellen(x,y);
	ausgabe(x,y);
	
  }
 
Beliebter Fehler:

srand darf nur ein einziges Mal aufgerufen werden, am besten zu Beginn des Programmes.

Hintergrund:
Computer können keine echten Zufallszahlen generieren. Deshalb wird eine Pseudo-Zufallszahl ausgehend von einem "Seed" erzeugt. Wenn der gleiche Seed verwendet wird, kommt auch immer die gleiche Reihe an "Zufalls"-Zahlen heraus.
 
Nja das zwar auch aber hier scheint das Problem viel mehr zu sein, dass er überhaupt noch nicht verstanden hat wo der Gültigkeitsbereich einer Variable anfängt und wo endet.
 
@Endurion

Danke für deine Hilfe

@devDevil

Da muss ich dir recht geben die gültigkeiten der Variablen hab ich noch nicht ganz verstanden.
Ich fasse mal mein Wissen zusammen, wenn du Fehler siehst könntest du die vielleicht bitte richtigstellen.

Globale Variablen: Sind im Ganzen programm gültig und werden ausserhalb jeder function definiert, am besten gleich nach den includes

eine Variable die in der Main deklariert wird ist nur in der Main Funktion gültig.

Jetzt stellt sich mir die Frage wie sich dies in den Funktionen verhält.

Datentype funktionsname (Datentype Parametername)

aufruf in main(): funktonsname(ursprüngliche_Variable)

dann ist diese neue Variable parametername nur in der Funktion gültig (eine Kopie der ursprünglichen Variabel) das ergebnis muss über ein return zurückgegeben werden.

Will ich aber gezielt die gespeichert Variable verändern dann muss ich das mit einem Pointer machen:

z.B.:

int var; //Variabele deklarieren
int *ptr; //Pointer deklarieren
ptr=&var // Speicheradresse von var auf ptr referenzieren

* ist dereferenzierungsoperator (Zeigt an das es sich um einen Pointer handelt)
& zeigt an das es sich um eine Speicheradresse handelt auf die verwiesen wird


Funktionsaufruf:

Datentype Funktionsname(Datentyp *ptr)
{
*ptr=*ptr+1

Der einzige unterschied zwischen der übergebe einer Variable und des Verwenden eines Pointer ist das beim Pointer weniger Speicherplatz verwendet.

Das Problem mit den Variablen gültigkeit weitet sich ja aus bei mir. der Compiler lässt es ja zu Variablen Global zu deklarieren aber das Array kann ich nicht global definieren vorallem weil ich ereichen will das der Nutzer auswählt wieviel tips er ausgegeben bekommt und das Array auch nicht größer machen will.


@Endurion

Danke für deine Hilfe
 
Zurück