Forum: Compiler & IDEs Zufallsgenerator für Manschaft Turnier


von Mueller B. (frankyfarell)


Lesenswert?

Hallo alle zusammen,ich benötige einen Zufallsgenerator in C für 
Fussball-Turnier mir 16 Mannschaften, die in 4 Teams in Gruppen verteilt 
sind und gegeneinander spielen sollen, aber nur jeweils einmal. Die 
beide siege pro gruppen kommen weiter. Ich bin auch ein völliger neuling 
in richtung C-Programmierung und will diese Aufgaben erledigen.

Danke voraus.

char *team[] = {"Team1","Team2","Team3",........"Team16"};

in 4 gruppen die 2 sieger weiterkommen

von Sebastian (Gast)


Lesenswert?

Echter Zufall ist schwer zu programmieren. Sicherlich gibt es 
"Pseudozufalls-Algorithmen" im Netz zu finden, in Unix-ähnlichen 
Systemen, auch in Linux, kann man üblicherweise einen Wert aus 
"dev/random" lesen. Ansonsten ist es eventuell möglich, äußere 
Ereignisse heranzuziehen - z.B. einen Tastendruck des Benutzers - um 
irgendeine Schleife zu stoppen, in der der "Zufalls"-wert kontinuierlich 
neu berechnet wird. Wenn die Aforderungen gering sind, reicht oft schon 
eine Division durch 7, von der immer der Rest weiterverwendet wird. Dann 
muß man nur noch wissen, in welchem Wertebereich die Zufallszahlen 
liegen, und diese sinnvoll den möglichen Ergebnissen zuordnen.

von Sebihepp (Gast)


Lesenswert?

Schau dir mal die Funktionen "int rand(void)" und "void srand(unsigned 
int seed)" der Standardbibliothek "stdlib" an.

#include <stdlib.h>

Das dürfte der einfachste Weg sein, wenn ihr diese benutzen dürft. =)

von Mueller B. (frankyfarell)


Lesenswert?

Danke Sebihepp,

habe schon den Zufallsgenerator geschaft aber wie ich diesen 16 
Mannschaften in 4 Teams in Gruppen verteilen kann, komme ich noch nicht 
klar.
hie
 C-Code fur Zufallsgenerator: perfekt!
#include <time.h>
#include <stdio.h>
#include <stdlib.h>

 char *team[] = {"Team1","Team2","Team3",........"Team16"};


int main(void)
{
  srand((unsigned int)time(NULL));
  printf("Zufall Team:\n%s\n", team[rand()%(sizeof team/sizeof 
team[0])]);
  return 0;
}
*********************
jetzt soll ich alle in 4 Teams in Gruppen verteilen:
GruppeA: Team1,Team4,Team7,Team10
GruppeA:................
...................

Bitte Helfen Sie mir

von Knarzer (Gast)


Lesenswert?

Ei ei ei... so wenig Eigeninitiative... hab heute aber nen guten Tag, 
daher:

Quick n' dirty
1
#include <stdio.h>
2
3
int main() {
4
    int teamNr;
5
    int numbers[16];
6
    int teams[4][4];
7
    int i,j;
8
    
9
    for(i=0; i<4; i++) {
10
  for(j=0; j<4; j++) {
11
      teams[i][j] = -1;
12
  }
13
    }
14
    
15
    for(i=0; i<16; i++) {
16
  numbers[i] = 0;
17
    }
18
19
    srand(time(NULL));
20
    
21
    for(i=0; i<4; i++) {
22
  for(j=0; j<4; j++) {
23
      while(teams[i][j] == -1) {
24
    teamNr = rand()%16;
25
    if(numbers[teamNr] == 0) {
26
        numbers[teamNr] = 1;
27
        teams[i][j] = teamNr+1;
28
    }
29
      }
30
  }
31
    }
32
33
    for(i=0; i<4; i++) {
34
  printf("Gruppe %d\nTeams: ",i+1);
35
  for(j=0; j<4; j++) {
36
      printf("%d ",teams[i][j]);
37
  }
38
  printf("\n");
39
    }
40
}

von Mueller B. (frankyfarell)


Lesenswert?

Knarzer
Vielen Dank fuer deine hilfe, dein code hat mir wahnsinnig geholfen, 
aber eine frage.
wie könnte ich die werte in string umwandeln, so dass  statt werten 
string entsprechend Team-Name ausgegeben werden?

von Knarzer (Gast)


Lesenswert?

Hallo,

bitte bitte ;)

Ich hab jetzt grad nicht mehr die Zeit (und zugegebenermaßen auch nicht 
die Lust) da noch was zu programmieren.

Die Ausgabe als String ist oben bereits umgesetzt, alles was du anpassen 
musst sind die entsprechenden printf-Befehle.

von Mueller B. (frankyfarell)


Lesenswert?

Hi Ich habe folgendes umgeschrieben aber kommt kein string raus, würdest 
du mir mal n Blick drauf werfen? DAnke

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *numbers[] = {"Team1","Team2","Team3",........"Team16"};


int main()
{
    int teamNr;
    int teams[4][4];
    int i,j;

    for(i=0; i<4; i++)
  {
    for(j=0; j<4; j++)
    {
      teams[i][j] = -1;
    }
    }

      for(i = 0; i < sizeof(numbers)/sizeof(int); i++)
  {
        numbers[i] = (char*)0;
    }

    srand(time(NULL));

    for(i=0; i<4; i++)
  {
    for(j=0; j<4; j++)
    {
      while(teams[i][j] == -1)
      {
        teamNr = rand()%16;
        if(numbers[teamNr] == (char*)0)
        {
          numbers[teamNr] =(char*) 1;
          teams[i][j] = teamNr+1;
        }

      }
    }
    }

    for(i=0; i<4; i++)
    {
      printf("Gruppe %d\nTeams: ",i+1);
      for(j=0; j<4; j++)
      {
        printf("%d ",teams[i][j]);
      }
         printf("\n");
    }
  //system("pause");
  return 0;
}

von Rolf Magnus (Gast)


Lesenswert?

Mueller Best's schrieb:
> char *numbers[] = {"Team1","Team2","Team3",........"Team16"};

Ok, hier hast du also deine Team-Namensliste....

Mueller Best's schrieb:
> for(i = 0; i < sizeof(numbers)/sizeof(int); i++)
>   {
>         numbers[i] = (char*)0;
>     }

... und hier schmeißt du alle Namen weg.

Mueller Best's schrieb:
> numbers[teamNr] =(char*) 1;

Was denkst du denn, welcher String an der Speicherstelle mit der Adresse 
1 steht?

Ohne auch nur ein kleines Bischen Grundverständnis dafür zu haben, was 
das Programm tut, wirst du keine Chance haben, irgendwas so zu 
verändern, daß es nachher noch tut.

von Mueller B. (frankyfarell)


Lesenswert?

Hallo  Rolf Magnus, danke fuer deien antwort.
char numbers[16][20] = {"Team1","Team2","Team3",........"Team16"};

aber sowie ich sagte bin ich C Anfänger und kommemit string array noch 
nicht ganzt klar. ich denke String an der Speicherstelle mit der Adresse
1  ist "Team1"  char numbers[0] = "Team1"; aber wie glreiffe ich hinzu?

for(i =0; i < 5;i++)
{
    numbers[i]= numbers[0];??????
    printf("\n%s\n", numbers[i]);
}


kann es so sein??

Danke Dir

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Man man man man man, da wird dir schon alles vorgekaut, und dann muss 
man dir das letzte Bröckchen auch noch pürieren!
1
for(i=0; i<4; i++) {
2
    printf("Gruppe %d\n",i+1);
3
    for(j=0; j<4; j++) {
4
        printf("Team %d\n",teams[i][j]);
5
    }
6
    printf("\n");
7
}

Wie kommt man bitte auf die Idee sowas "komplexes" entwickeln zu wollen 
wenn du absoluten Basics nicht vorhanden sind?

von Mueller B. (frankyfarell)


Lesenswert?

Hallo alle zusammen, Ich schaffe es nicht  diese strings über einen 
Zufallsgenerator in 4 Gruppen anzuordnen. Kann mir bitte jemand helfen? 
Ich wäre Ihnen sehr dankbar. ich bin eigentlich sehr schwach in C.



#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char 
*numbers[]={"Team1","Team2","Team3","Team4","Team5","Team5"........"Team 
16"};

int main()
{
    //int teamNr;
    //int numbers[16];
    char *teams[4],**temp;
    int i,j;

    for(i=0; i<4; i++)
  {
      temp = teams[i] ;
    }

    for(i=0; i<16; i++)
  {
        numbers[i] = numbers[0];
    }
    srand(time(NULL));

    for(i=0; i<4; i++)
  {
    for(j=0; j<4; j++)
    {
      while(teams[i][j] == -1)
      {
        if(numbers[rand()%(sizeof numbers/sizeof numbers[i])] == 
numbers[0])
        {
          numbers[rand()%(sizeof numbers/sizeof numbers[i])] = 
numbers[1];
          teams[i] = (rand()%(sizeof numbers/sizeof numbers[i]))+1;
        }
      }
    }
    }

    for(i=0; i<4; i++)
    {
      printf("Gruppe %d\nTeams:",i+1);
      for(j=0; j<4; j++)
      {
        printf("%s ",teams[i]);
      }
         printf("\n");
    }
  //system("pause");
  return 0;
}

von Peter (Gast)


Lesenswert?

Ich würde einfach das Array mit den 16 Einträgen mischen und dann sind 
die Teams 0-3 in Gruppe 1, 4-7 in Gruppe 2, 8-11 in Gruppe 3 und 12-15 
in Gruppe 4.
Ein Array von Strings würde ich nicht unbedingt numbers[] nennen.
Also mal schnell was hingetippt, ungetestet.

#include ....
char *teamnamen[] = 
{"Team1","Team2","Team3","Team4","Team5","Team5"........"Team16"};

main()
{
  int jog, gruppe;
  srand(time(NULL));

/* mischen */
  for(jog=0; jog<16; jog++)
  {
    int r=rand()%16;
    char *tmp=teamnamen[jog];
    teamnamen[jog]=teamnamen[r];
    teamnamen[r]=tmp;
  }

/* ausgeben */
  for(gruppe=0; gruppe<4; gruppe++)
  {
    printf("Gruppe %d : ", gruppe+1);
    for(jog=0; jog<4; jog++)
    {
      printf("%s ", teamnamen[4*gruppe+jog]);
    }
    printf("\n");
  }
}

Peter

von Mueller B. (frankyfarell)


Lesenswert?

Hallo Peter fuer deine Hilfe bin ich dir sehr sehr dankbar .
Alle, die mir bei den Aufgaben geholfen haben, ohne eure Hilfe hätte ich 
das nie geschafft

von Lehrmann M. (ubimbo)


Lesenswert?

Ein kleiner Zusatz für 'Zufallsinteressierte':
http://www.kielnet.net/home/julien.thomas/tech/XR232WEB.htm

von Rolf Magnus (Gast)


Lesenswert?

Mueller Best's schrieb:
> Alle, die mir bei den Aufgaben geholfen haben, ohne eure Hilfe hätte
> ich das nie geschafft

Was geschafft? Dir wurde doch alles, und ich meine wirklich alles 
vorgekaut.

von dsgdsg (Gast)


Lesenswert?


von dsgdsg (Gast)


Lesenswert?

(Weitere Kommentare spare ich mir.)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.