Warum funktioniert diese Rechnung nicht???



  • Hallo,
    ich beschäftige mich schon seit einem halben Jahr mit C++ und
    habe vor kurzem ein Lotto simulations Programm geschrieben.
    Wenn man aber dass Programm sehr oft simulieren läßt hat dies
    auch manchmal länger gedauert. Deswegen wollt ich das Programm
    anzeigen lassen wie weit es schon ist. Wenn ich aber das Programm
    laufen lasse zeigt es immer 0% an bis es fertig ist und dann 100%.
    Die Programmzeile sieht so aus:

    if((momentanerdurchläufe%10000)==0)
    {
    prozent=(momentanerduchläufe/insgesammtedurchläufe)*100;
    cout<<prozent<<"%\n";
    }



  • Bei momentanerduchläufe/insgesammtedurchläufe wird eine Ganzzahldivision durchgeführt. Das ist immer Null, bis die Werte gleich sind, dann wird es eins. Du könntest einen der Werte explizit in einen Gleitkommatyp umwandeln, oder einfach zuerst mit 100 multiplizieren:

    prozent=momentanerduchläufe*100/insgesammtedurchläufe;



  • zeig mal n größeren Codeausschnitt ...



  • prozent=(momentanerduchläufe/insgesammtedurchläufe)*100
    ->
    prozent=(momentanerduchläufe*100)/insgesammtedurchläufe
    

    Vorausgesetzt die Variablen können den hundertfachen Wert von insgesammtedurchläufe halten natürlich.



  • Also ich hab gedacht des würd reichen wenn Prozent eine Gleitkommazahl ist.

    hustbaer schrieb:

    Vorausgesetzt die Variablen können den hundertfachen Wert von insgesammtedurchläufe halten natürlich.

    Also bis jetz hatte ich immer Gesammtduchläufe und Momentanerduchläufe
    als int. Und wenn ihr vll ungefähr wisst wie groß die Warscheinlichkeit ist im
    Lotto zu gewinnen könnt ihr euch vorstellen ,dass Gesammtdurchläufe immer so
    viel Nullen hat wie möglich sonst kann man die ganze Simulation gleich verharzen.



  • Also wenn du mit deinem Maximalwert an die Grenzen von int (oder long) stößt, wirst du mit der Rechnung schnell vor einem neuen Problem stehen: Ganzzahl-Überlauf. Da müsstest du schon nach einem größeren Datentyp suchen oder einen der Eingangswerte casten. Die kürzeste Variante wäre wohl:

    prozent=(momentanerduchläufe*100.0)/insgesammtedurchläufe
    

    PS: Man kann es auch übertreiben mit den aussagekräftigen Variablennamen 😉



  • schonmal versucht '\n' duch endl auszutauschen



  • Was für längere Variabeltypen gibt es denn noch?
    Aber man kann auch einfach mehrere While schleifen verschachteln
    des wär dann zwar nen bisschen unbeholfen .Und des mit der % Anzeige würd dann
    komplizierter.
    Und

    CStoll schrieb:

    PS: Man kann es auch übertreiben mit den aussagekräftigen Variablennamen 😉

    Wenn ich die nicht richtig bennen dann raff ich nach ner Weile meinen Quellecode
    nicht mehr.



  • Kommt drauf an was du für einen Compiler verwendest, die üblichen Verdächtigen wären

    long long i;
    int64_t j;
    intmax_t k;
    __int64 l;
    

    Ansonsten kannst du für die Berechnung der Wahrscheinlichkeit u.U. ein double verwenden:

    double prozent = double(momentanerduchläufe) * 100 / insgesammtedurchläufe;
    

    Was Variablennamen angeht: ich würde die einfach "current" und "total" nennen, bzw. vielleicht noch "currentLoops" und "totalLoops". Das Englische hilft oft sehr Namen kurz zu bekommen, bei gleicher "Aussagekraft". Und CamelCasing hilft beim Lesen 😉


Anmelden zum Antworten