Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Ausgewählte Zufallszahlen nach jeder Schleife ausschließen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
09.04.2004, 16:25 Uhr
~Didi
Gast


Hallo,

ich möchte aus 18 Zahlen jeweils 2 zufällig auswählen und das 9 mal, aber wenn ich die Schleife ein weiteres mal aufrufe sollen die bereits ausgelosten Zahlen nicht mehr zur Verfügung stehen, also bis am ende nur noch zwei Zahlen übrig bleiben.Ich weiss einfach nicht wie ich anfangen soll. Könnt ihr mir helfen ?


Didi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
09.04.2004, 20:39 Uhr
theosoft



Hi Didi,
vielleicht willst du's mal in diese Richtung probieren:

ein array mit max (=18) Elementen holen und mit den 18 Zahlen initialisieren.
randdom(max) soll einen Index zwischen 0 und max-1 (=17) liefern.
Der Wert des array-elements soll die erste gewählte zufallszahl sein.
jetzt ein array mit max-1 holen und alle Elemente des ersten arrays, deren
Index nicht gleich (! dem gelieferten Zufallsindex sind werden ins
zweite array (also vom 18er-array ins 17er-array)
geschrieben. Der Speicher des 1. array wird zurückgegeben und so weiter.

viel Erfolg wünscht
theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
09.04.2004, 20:57 Uhr
theosoft



uppps, ich hab's lieber mal getestet -> oben habe ich's mit zu umständlich vorgestellt.

vielleicht hilft die folgender code auf die sprünge:

C++:
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  int zz[18] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180};
  int zi;
  int i = 1, max = 18;
  randomize();
  while(max > 0)
  {
    zi = random(max);
    cout << i << ". Zufallszahl: " << zz[zi] << endl;
    int neui = 0;
    for(int index=0; index < max; index++)
    {
      if(index != zi)
      {
        zz[neui] = zz[index];
        neui++;
      }
    }
    max--;
    i++;
  }
  getch();
  return 0;
}


ich hoffe das hilft,
viel Spass, theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.04.2004, 16:13 Uhr
~Didi
Gast


Hallo Theo,

habs mal ebend ausprobiert und etwas abgeändert, doch leider kommen hin und wieder trozdem schon ausgwählte Zahlen. Irgendwo steckt noch ein Fehler, kann ihn leider nicht finden , vieleicht fällt jemand anders etwas auf...



C++:
#include <time.h>
int main()
{

  int zz[18] = {10,20,30,40,50,60,70,80,90,100,110,120,130,140,150,160,170,180};
  int zi;
  int i = 1, max = 18;

srand (time(NULL));

  //randomize();

while(max > 0)
  {
    zi = rand() % 18 ;
    cout << i << ". Zufallszahl: " << zz[zi] << endl;
    int neui = 0;
    for(int index=0; index < max; index++)
    {
      if(index != zi)
      {
        zz[neui] = zz[index];
        neui++;
      }
    }
    max--;
  i++;
  getch();
  }

return 0;
}


Gruß , Didi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.04.2004, 17:30 Uhr
~Didi
Gast


am einfachsten währe es doch, wenn der Zufallsgenerator schon von vornherein die Zahlen nur einmal ausgibt, gibt es so eine Funktion nicht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.04.2004, 19:20 Uhr
theosoft



Lieber Didi,

ich glaube nicht, dass es bei meiner Version doppelte Auswahl gibt.
Ich meine, das hängt an deiner Modulo-Operation.

zi = rand() % 18 ;

18 ist hier nicht korrekt - ich nahm max, weil 18 nur beim ersten Durchlauf stimmt.

Warum lässt du's eigentlich nicht bei "randomize()" und "random(max)" ?

Viel Spass
theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.04.2004, 21:28 Uhr
~Didi
Gast


Hallo Theo,

also ich weiss auch nicht, irgenwie klappt es einfach nicht, mein Problem ist ja auch eigentlich das ich ein Spielplan für unseren Verein machen soll, bei dem halt die Begegnungen zusammen gestellt werden. Bis jetzt hab ich ja auch so gut wie alles, nur nicht das es vorkommen kann das ein Verein mehrmals spielen kann. Hier mal ein Teil meines Code bis zur Ausgabe der Begegnungen.



C++:
vector<string> Vereine;
ifstream dat_ein;
string dateiname = ("Vereine.txt");
string tmp;

srand (time (NULL));

dat_ein.open(dateiname.c_str(),ios_base::in);

if(!dat_ein)
{
cout <<"Datei konnte nicht geoeffnet werden"<<endl;
return -1;
}

while(!dat_ein.eof())
{
dat_ein >> tmp;
Vereine.push_back(tmp);
}

sp2=sp1=rand()%Vereine.size();

while(sp2==sp1)sp2=rand()%Vereine.size();

cout <<"\n\nSpiel "<< i+1 <<": "<< Vereine[sp1]<<" gegen "<<Vereine[sp2]<< endl;





und hier komm ich nicht richtig weiter.

Didi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.04.2004, 22:33 Uhr
theosoft



sorry, aber jetzt muss ich passen.
Ich verstehe leider kaum etwas von deinem code-fragmet und weiss nicht, warum du diesen Weg gehst.
Jeder hat so seinen eigenen Programmierstil. Also, wie gesagt: mein oben gezeigter code löst die Forderung mit der Zufallsauswahl ein; mehr habe ich leider nicht drauf.

viel Erfolg noch wünscht
theo
--
ifS (immer fröhliches Schaffen)
theosoft
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
11.04.2004, 01:19 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


man kann sich auch ein kopf machen und merken welchen man schon gewählt hat... ne einfache Lösung wäre einfach das teil "durchzumischen" und dann 1 gegen 2.... 3 gegen 4.....5 gegen 6 usw... spielen zu lassen...
obs für die stl-containerklassen schon ne fertige mischfunktion gibt weiss ich nicht aber wenn nicht sollte es so funzen

C++:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <ctime>

int main(){
std::vector<std::string> Vereine,Spiele;
std::vector<std::string>::iterator x;
std::ifstream dat_ein;
std::string y,dateiname = ("Vereine.txt");
std::string tmp;
int i;

srand(time(NULL));

dat_ein.open(dateiname.c_str(),std::ios_base::in);

if(!dat_ein){
std::cout <<"Datei konnte nicht geoeffnet werden"<<std::endl;
return -1;
}

while(!dat_ein.eof()){
dat_ein >> tmp;
Vereine.push_back(tmp);
}

//hier wird einfach das array gemischt... ich kenn die stl jetzt nicht so gut eventuell gibts da auch schon ne fertige mischfunktion
while(Vereine.size()){
    x= Vereine.begin()+rand()%Vereine.size();
    Spiele.push_back(*x);
    Vereine.erase(x);
}

//das hier funzt nur bei gerade anzahl von spielern...
for(i=0;i<Spiele.size();i+=2)
    std::cout <<"\n\nSpiel "<< i/2+1 <<": "<< Spiele[i]<<" gegen "<<Spiele[i+1]<<std::endl;
    

}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.04.2004, 20:05 Uhr
~Didi
Gast


Danke Windalf, so erfüllt es genau seinen Zweck den ich haben wollte.

Gruß, Didi
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: