Zufallsgenerator



  • Hey, ich bin grad drauf und dran Progrmmieren zu lernen..... Hab auch schon einige Programme geschrieben....
    Aber im ganzen internet steht NIX was nicht Hochwissenschaftlich ist..... derweil bin ich soweit... das ich mit einer If funktion die Zahl definiert habe.... der Lehrer will aber umbedingt n Zufallsghenerator kann mir wer helfen?

    #include <cstdlib>
    #include <iostream>
    #include <conio.h>
    using namespace std;

    int main(int argc, char *argv[])

    {

    double a;
    do{
    printf("Gib eine Zahl von 0 bis 100 ein =)\n\n\n");
    scanf("%lf",&a);
    if (a>=101)
    {
    printf("falsche eingabe, da steht zwischen 0-100 kannst net lesen?\n\n\n");

    }
    else
    {

    if(a==54)
    {
    printf("Hey Super Gemacht 🙂 😛 😃 xD\n\n\n");
    }
    if(a>=55)
    {
    printf("Niedriger\n\n");
    }
    if(a<=56)
    {
    printf("Groeser\n\n");
    }
    }
    }
    while (a!=54);

    system("PAUSE");
    printf("\n\n\nBy Am!cUs Wausal");
    getch();
    }



  • Reicht es dir, dort eine Zufallszahl zu bekommen? Wenn ja, schau dir mal man: rand() an.



  • Naja, aber wie bringe ich das ein?? Also wo sollte das rein??



  • Die Funktion liefert eine (Pseudo)Zufallszahl im Bereich von 0 bis RAND_MAX - die kannst du auf den für dich interessanten Zahlenbereich runterskalieren und in einer Variablen speichern, die du dann in den if()-Abfragen mit der Nutzer-Eingabe vergleichst.

    (weitere Informationen findest du in Marcus' Magazin-Artikel "Zufälle gibt's" oder auch auf der Manual-Seite, die ich oben verlinkt habe)



  • Ja klar... aber wo u. in welcher zeile sollte das srand stehen, also ganz oben noch vor der ersten { oder vor der If funktion?



  • Ein paar kleine Anmerkungen zum Quelltext:

    - Wenn du C++ nutzt (das tust du ja offensichtlich, sonst schriebest du nicht hier), nutze auch die Möglichkeiten, die dir die C++-Standardbibliothek kostenfrei zur Verfügung stellt ('cin', 'cout', etc) für die Ein- und Ausgabe.

    - cstdlib und conio brauchst du daher nicht

    - Verwende keine system-calls (system("PAUSE"))

    - Warum deklarierst du eine Variable vom Typ double für eine Eingabe, wenn du Ganzzahlen (int, long int) erwartest und auch mit diesem arbeitest? Du fragst zwar Fließkommazahlen vom Benutzer ab, aber bei den Vergleichen verwendest du Ganzzahlen.

    - Kommentare sind sinnvoll 😉

    * Die main-Funktion sollte (muss aber nicht) einen Wert zurück geben. Dieses Thema wurde hier schon sehr kontrovers diskutiert, daher markiere ich das als meine ganz persönliche Meinung 😉

    #include <iostream>
    using namespace std;
    
    int main(int argc, char** args)
        {
            unsigned int eingabe;
            unsigned int zufallszahl = funktion_die_zufallszahl_gibt(); // (1)
    
            // .. Schleifenbeginn
    
            cout << "Bitte geben Sie eine Zahl zwischen 1 und 100 ein: " << endl;
            cin >> eingabe;
            // ... Eingabe überprüfen
            // ... Mit Zufallszahl vergleichen und entsprechende Meldungen
            //     ausgeben.
    
            // .. Schleifenende
    
            // .. cin.get() wartet auf  eine Eingabe. (2)
            cin.get();
            return EXIT_SUCCESS;
        }
    

    Grüße...

    Heiko

    ---
    Fußnoten:
    (1): Zum Thema Zufallszahlen siehe CStoll
    (2): Zum Thema "Fenster schließt sich sofort wieder" siehe Konsolen-FAQ



  • srand() (initialisiert den Zufallsgenerator) kannst du gleich als ersten Aufruf in der main()-Funktion einbauen - den anschließenden rand()-Aufruf vor die do-Schleife.

    Was mir gerade auffällt - willst du wirklich mit Gleitkomma-Zahlen arbeiten? Und was soll bei einer Eingabe wie 54.3 rauskommen?



  • Problem I: Ich MUSS coino verwenden (Lehrerwille)
    Problem II: Wenn ich den Systemcall weggeb und ändere glaubt er wieder das ichs aus n internet koperit habe das wir nicht dürfen.... Das Programm sollte also komplett Primitriv sein...
    Problem III: Double für den Test bei der Doku... Er gibt unendlichkeitsziffern und hört nicht mehr auf weiter anzuzgeien ohne eingabe... deswegen hab ich double verwendet weil er meint das Kommazahlen zum Test dazugehören.

    Ich steh also vor einer Mauer von Informationen und kann damit nix anfangen xD
    U. so manche Fachausdrücke versteh ich noch net ich Programmier noch net sonderlich lang..



  • wenn es wie eben Definiert ist, niedriger.... aber wie gesagt der lehrer will es so...



  • Du kannst deinem Lehrer gerne ausrichten, daß er eine Weiterbildung benötigt 😉

    (die Bemerkungen zu double solltest du noch mal in verständlicher Form wiederholen)



  • Tut mir leid xD
    Naja es ist so... anfangs hatte ich INT....
    Aber wenn er bei INT eingibt (also in den Compailer) 34.445
    Macht er ungefähr das NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER NIEDRIGER

    Nur das er net aufhört.... und deswegen hab ich double genommen um dieses Problem vorzubeugen...



  • Lehrerwille... (der braucht mal wieder ne Auffrischung in Sachen Programmierung)

    Das Problem bei Fließkommazahlen ist, dass diese nur Näherungswerte sind. Das heißt, dass du nie einen Treffer landen wirst, bzw. dieser sehr unwahrscheinlich sein wirst. Du müsstes mit einem Schwellenwert arbeiten:

    b := Die Benutzer eingegebene Zahl aus der Menge R der reellen Zahlen
    z := Zufallszahle aus der Menge R der reellen Zahlen
    d := Schwellenwert (zulässige Abweichung) aus der Menge der reellen Zahlen

    Wobei immer dann ein Treffer vorhanden ist wenn:

    b <= z + d UND b >= z - d

    Und entsprechende Abfragen für die "größer als"- und "kleiner als"-Ergebnisse.

    Dadurch wird das Programm nicht wirklich "primitiver".

    Grüße...



  • Tjy, in einen int kannst du auch keine Komma-Zahlen reinpacken - also wird das Programm das ".445" im Eingabepuffer zurücklassen (und von da an ständig daran scheitern, den Punkt als Ziffer zu interpretieren). Solche Fehleingaben mußt du abfangen - und die Überreste entsorgen (und das geht mit C++ IOStreams wesentlich eleganter als mit C's scanf()).



  • Ja weiters problem ist, wir haben nur scanf gelernt.... xD
    Also ich hab keine Ahnung was du mir zu sagen versuchst.... ich könnte versuchen mit einer 2. else funktion kommazahlen als falsche aussage auszugrenzen oder?



  • b <= z + d UND b >= z - d

    ich sags mal ganz dierekt.... Hääääähh?? xD



  • Ich werde wieder heut abend rein schaun unterricht ist jetzt aus... danke für eure hilfe

    Liebe Grüße



  • Mit scanf() bist du im falschen Board gelandet - das gehört eher nach C als C++
    (kannst du bitte den offiziellen Titel eures Kurses nennen)

    Am!cUs__Wausal schrieb:

    b <= z + d UND b >= z - d

    ich sags mal ganz dierekt.... Hääääähh?? xD

    Gleitkomma-Zahlen exakt zu vergleichen ist ein "leichtes" Problem - da schlagen die Ungenauigkeiten bei der Zahlendarstellung zu. Deswegen muß man eine gewisse Toleranz festlegen und vergleicht, ob sich die Werte innerhalb dieser Toleranz aufhalten.



  • Naja wir arbeiten im C++ builder also dachte ich es gehört hier her....
    Ich geh ins TGM Wien 21 bezirk Wexstraße 1DHEL.... Also kein richtiger Kurs.



  • TwOT: Wenn ich mich nicht ganz täusche, dann ist die höchste Zahl der Versuche, die man bei diesem Spiel benötigen sollte:

    n=log2rn=\log_2 r(hoffentlich habe ich das richtig abgebildet)

    Wobei n (ohne Nachkommastellen) die Anzahl der maximal zu benötigenden Versuche ist, in einem Bereich welcher r Möglichkeiten bietet.

    Es macht folglich keinen Sinn, eine Fließkommazahl wählen zu dürfen, weil die Menge (die abzählbaren Zahlen) der reellen Zahlen zwischen einschließlich 1 und einschließlich 100 unendlich ist.

    Grüße... Heiko


Anmelden zum Antworten