Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zufallszahlen

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 <
000
23.03.2003, 17:31 Uhr
~marchmello
Gast


HI
Euer Forum sau stark!!!!!!!

Ich hab aber nen problem mit C !
wenn ich eine Zufallszahl erstellen will mache ich
das so:

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

int main()
{

int zufallszahl,i;

srand(time(NULL));

for(i=0;i<5;i++)
printf("Die Zufallszahl lautet %d\n",zufallszahl=rand()%10+1);

return 0;
}

Jetzt bekomme ich 5 Zahlen im Raum con 1-10!
Ich möchte aber das sich die Zahlen nicht wiederholen!

Wie kann ich das machen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.03.2003, 20:31 Uhr
lookIN



Hi,
machs halt einfach mit nem array, in dem du die Zufallszahlen speicherst und dann nen if-Filter drüber. So in der Art:

C++:
if((zahl[0]==zahl[1])||(zahl[1]==zahl[2])||(zahl[4]==zahl[5]) usw

und dann machst du so lange neu Zufallszahlen, bis sich keine wiederholen, oder du machst alle in einzelne if() anweisungen und änderst dann nur ein Zahl:

C++:
if(zahl[0]==zahl[1])...


Ich weiß jetzt nicht sich, was von der Laufzeit her effektiver ist, aber ich denk, dass die zweite effektiver ist.
was anderes fällt mir dazu nicht ein.
--
--
lookIN
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.03.2003, 00:59 Uhr
virtual
Sexiest Bit alive
(Operator)


Die von lookIN vorgeschlagende Lösung hat den Nachteil, daß sie vom Laufzeitverhalten sehr ungünstig ist. Wie wärs mit einer STL Lösung:

C++:
#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    int v[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    std::random_shuffle(v, v+10);

    std::copy(v, v+10, std::ostream_iterator<int>(std::cout, " "));
    std::cout << std::endl;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.03.2003, 09:50 Uhr
~0xdeadbeef
Gast


Hat natürlich den Nachteil, dass es C++ ist. Wenn ich das richtig gesehen habe, sollte das in reinem ANSI-C sein. Ich würde mir für die Zahlen 1-10 merken, welche schon dran waren und ggf. eine neue Zahl anfordern. Etwa so:

C++:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

int main()
{
    int zufallszahl,i,warschonmalda[]={0,0,0,0,0,0,0,0,0,0}; //10 mal null (false)

    srand(time(NULL));

    for(i=0;i<5;i++) {
        do {
            zufallszahl = rand() % 10;              //Zufallszahl holen, solange bis
        } while(warschonmalda[zufallszahl]);  //eine dabei rauskommt, die noch nicht da war.
        wahrschonmalda[zufallszahl] = 1;       //jetzt war die Zahl da, also warschonmalda[zufallszahl] auf true setzen

    printf("Die Zufallszahl lautet %d\n",zufallszahl+1); //ausgabe
}

return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.03.2003, 09:52 Uhr
~0xdeadbeef
Gast


Na gut, die Einrückung war jetzt ein bisschen bescheuert. Das printf und die Klammer, die die for-Schleife schließt, sollten eigentlich ein Tab weiter rechts sein. Ich hab den Code jetzt nicht getestet, aber es sollte so gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.03.2003, 11:53 Uhr
virtual
Sexiest Bit alive
(Operator)


Wenn es unbedingt C sein muß, würde ich aber sowas vorziehen, weil es vom Laufzeitverhalten deutlich schneller ist: Mag sein, daß die Routine bei relativ kleinen Arrays okay ist, aber die O-Time steigt bei beefies Ansatz im Schnitt exponentiell.


C++:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void random_shuffle(int* zahlen, int anzahl)
{
    int i;
    for(i=0; i<anzahl; ++i)
    {
        int j,t;

        j = rand()%anzahl;
        t = zahlen[j];
        zahlen[j] = zahlen[ i ];
        zahlen[ i ] = t;
    }
}


int main()
{
    int v[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int i;

    srand(time(NULL));
    random_shuffle(v, 10);

    for(i = 0; i<10; ++i) printf("%d\n", v[ i ]);
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.03.2003, 12:23 Uhr
~0xdeadbeef
Gast


Es hängt vom Verhältnis der Zahlen, aus denen du auswählen kannst, zur Anzahl der Zufallszahlen, die du brauchst, ab. Dein Algorithmus ist extrem ungünstig, wenn die Zahlen sehr weit auseinanderliegen - zum Beispiel 5 Zufallszahlen aus dem Intervall 1 bis 10000 - während meiner ungünstig wird, wenn die Zahlen nah beieinander liegen.

Allerdings - bei großen Zahlenbereichen sind beide Algorithmen nicht sonderlich praktikabel, wegen Speicherverbrauch. Für große Bereiche wäre sowas in der Art sinnvoller:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int _contains_redundancies(int *array, int len) {
    int i, j, tmp;
    for(i = 0; i < len; ++i) {
        tmp = array[ i ];
        for(j = i; j < len; ++j) {
            if(array[j] == tmp) return 1;
        }
    }
    return 0;
}

int* getRandomArray(int anzahl, int min, int max) {
    int i, j, intervall, ret[anzahl];

    if (min > max) { i = min; min = max; max = min; }
    if ((intervall = max - min + 1) < anzahl) return NULL;

    for(i = 0; i < anzahl; ++i) {
        do {
            ret[ i ] = (rand()%intervall)+min;
        } while(_contains_redundancies(ret, i+1));
    }
    return ret;
}


Oder so in der Art. Ich bin grad zu faul zum debuggen, aber ich denke, das Prinzip dürfte klar sein. Der Algorithmus ist auf wenig Speicherverbrauch optimiert, frißt aber Rechenzeit wie die Hölle, wenn der Wert von intervall nahe bei dem von anzahl liegt.

Dieser Post wurde am 24.03.2003 um 13:37 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
24.03.2003, 12:25 Uhr
~0xdeadbeef
Gast


Irgendwie ist dieser THWboard code in einem C-Forum ziemlich unpraktisch. Also, in der dritten Zeile von _contains_redundancies soll array[ i ] stehen, in der fünftletzten von getRandomArray ret[ i ].
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
24.03.2003, 16:26 Uhr
~marchmello
Gast


Ich bins nochmal!
Ihr habt echt mächtig Ahnung von C und C++.
Ich weiß jetzt wie man Zufallszahlen erstellt, aber nun hab ich ein weiteres Problem:
Ich möchte einen Vokabeltrainer machen und habe auch schon den Test fertig, aber die Vokabeln kommen immer in der selben Reienfolge. Wie kann ich es machen, dass die Vokabeln in einer zufälligen Reienfolge kommen?
So sieht der Test bisher aus (natürlich etwas mehr Vokabeln):


C++:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

char eingabe[60];
int punkte;


int main ()
{
printf("Zum starten = \"start\"\nZur Auswahl zurueck = \"back\"\nZum beenden = \"exit\" \n \n");
gets (eingabe);
    if (!strcmp(eingabe, "start"))
       {
       system ("cls");
      
printf("LEKTION 1\n\n\n\nWas heisst:\n");
printf ("ave?\n\n");
gets (eingabe);
    if (!strcmp(eingabe, "sei gegruesst"))
        {
        printf ("RICHTIG!!!\n\n",eingabe);
        punkte++;
        }
        
    else
        printf ("Leider falsch! Richtig waere \"sei gegruesst\" gewesen!\n\n");

printf ("populus?\n\n");
gets (eingabe);
    if (!strcmp(eingabe, "Volk"))
        {
        printf ("RICHTIG!!!\n\n",eingabe);
        punkte++;
        }
    else
        if (!strcmp(eingabe, "Puplikum"))
        {
        printf ("RICHTIG!!!\n\n",eingabe);
        punkte++;
        }
        else
        printf ("Leider falsch! Richtig waere \"Volk,Puplikum\" gewesen!\n\n");
printf("Du hast %d Punkte erreicht!\n\n", punkte);    
  
}
    else
    if (!strcmp(eingabe, "back"))
        {
        system ("cls");
        system ("lektionwahl.exe");
        }        
    else
    if (!strcmp(eingabe, "exit"))
        abort ();

                                                                                                                                            

    
getch ();
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
24.03.2003, 17:08 Uhr
~0xdeadbeef
Gast


Je nachdem wie viele Vokabeln du nachher verwalten willst, wären die Ansätze verschieden. Wenn das ne größere Geschichte werden soll, würde ich C++ benutzen, weil du die Sachen darin besser kapseln kannst. Du wirst auch um ein vernünftiges Filehandling nicht drumherum kommen, und da ist C++ C einfach überlegen.

Was du auf jeden Fall brauchen wirst, ist eine dynamische Verwaltung der Vokabeln, das heißt, du brauchst eine Vokabelklasse, die die abzufragende Vokabel als String und die Bedeutung als Liste von anderen Strings verwaltet. Instanzen der Vokabelklasse sollten dann wieder in einer listenartigen Struktur (an dieser Stelle würde sich ein Vektor anbieten) gespeichert werden, und da kannst du sie über Zufallszahlen ansprechen. Für diesen Zweck kannst du dann auch virtuals ersten Algorithmus anwenden (der in C++ gegossene, der die STL verwendet). Ein Ansatz wäre sowas:

C++:
//vokabel.h
#include <string>
#include <list>

using namespace std;

class Vokabel {
protected:                                        
    string m_strVokabel;                    //die abzufragende Vokabel, in deinem Beispiel wäre das Latein
    list<string> m_lsstrBedeutungen; //was der andere antworten soll.

public:
    //Hier dann Kons- und Destruktoren sowie das eigentliche Interface. Ein bool abfragen(); würde sich anbieten, usw. halt.
};


Das Ding dann in einen vector, und den kannst du über den [ ]-operator wie ein Array ansprechen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


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: