www.mikrocontroller.net

Forum: Compiler & IDEs Zufallsgenerator für Manschaft Turnier


Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebihepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. =)

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Knarzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ei ei ei... so wenig Eigeninitiative... hab heute aber nen guten Tag, 
daher:

Quick n' dirty
#include <stdio.h>

int main() {
    int teamNr;
    int numbers[16];
    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<16; i++) {
  numbers[i] = 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] == 0) {
        numbers[teamNr] = 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");
    }
}

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Knarzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel H. (Firma: keine) (commander)
Datum:

Bewertung
0 lesenswert
nicht 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!
for(i=0; i<4; i++) {
    printf("Gruppe %d\n",i+1);
    for(j=0; j<4; j++) {
        printf("Team %d\n",teams[i][j]);
    }
    printf("\n");
}

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

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mueller Best's (frankyfarell)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lehrmann Michael (ubimbo)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: dsgdsg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: dsgdsg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Weitere Kommentare spare ich mir.)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.