zufallsfunktion,



  • Ach und das mit der zeit:

    1000*60*60*8, damit wollte ich einen arbeitstag von 8std. simulieren. oder hab ich die timer funktion bzw. syntax falsch verstanden?



  • Den RNG seed (srand) solltest du nur einmal vor dem ersten Aufruf der rand() Funktion aufrufen. Dadurch, dass du ihn mit einem konstanten Wert vor jedem Aufruf deiner Zufallsfunktion setzt erzeugst du jedes Mal die gleiche Sequenz von Zufallszahlen (was dann nicht mehr zufällig ist). Die rand() Funktion öfter aufzurufen macht die Zufallszahl übrigens auch nicht zufälliger. Wenn du gleichverteilte Zufallszahlen haben willst kannst du folgenden Schnipsel benutzen:

    double random()
    {
       return static_cast<double>( rand() ) / static_cast<double>( RAND_MAX ) * RAND_MAX;
    }
    

    Die VCL bietet auch noch einige Funktionen an, vielleicht hilft dir RandomRange ja weiter.
    Bitte poste pro Thread nur ein Problem, wenn du mehrere haben solltest mach bitte mehrere Threads auf.



  • Narf, vergiss das * RAND_MAX aus dem vorherigen Beitrag. Um ganz ehrlich zu vergiss am besten die ganze Funktion und benutz´ RandomRange 😮



  • Hallo

    Zum Thema Zufallsfunktionen siehe auch den Artikel im Forumsmagazin.

    bis bald
    akari



  • wenn ich 1-3 einegebe, dann ist ja die relative häufigkeit das ein fehler auftritt erhöht.

    das soll ja eher real an die echtheit gehalten werden.

    darum hab ich versucht das:

    70% der zufallszahlen = kein fehler
    20% || || = kleiner fehler
    10% || || = großer fehler



  • habs mal ganz neu gemacht, liefert aber trotzdem kein ergebnis.

    int Zufallsfunktion (void)
    {
    	Randomize();
    	ii = Random (100);
    	if(ii<= 70)
    	{
    		return r==true;
    	} else {return r==false;}
    
    	if (ii<70 && ii<=90)
    	{
    		return f1==true;
    	}else {return f1==false;}
    
    	if (ii>90)
    	{
    		return f2==true;
    	}else {return f2==false;}
    
    }
    
    void __fastcall TForm1::Button5Click(TObject *Sender)
    {
    	if (r == true)
    	{
    		Image2->Canvas->Brush->Color = clGreen;
    		Image2->Canvas->Rectangle(0,0,105,105);
    	}
    	if (f1 == true)
    	{
    		Image2->Canvas->Brush->Color = clYellow;
    		Image2->Canvas->Rectangle(0,0,105,105);
    	}
    	if (f2 == true)
    	{
    		Image2->Canvas->Brush->Color = clRed;
    		Image2->Canvas->Rectangle(0,0,105,105);
    	}
    }
    


  • Wenn ich mir deinen Code mal genauer ansehe kann ich deinen Gedankengang in keinster Weise nachvollziehen. Du hast eine Schleife, die du von 0 bis rand_max durchläufst. Im Schleifenrumpf setzt du die Schleifenvariable auf einen Zufallswert zwischen 0 und 99. Anschliessend überprüft du, ob die Schleifenvariable in einem bestimmten Intervall liegt und springst aus der Funktion zurück.
    Deine Zufallsfunktion sollte keine Informationen darüber haben, was mit dem Ergebnis angestellt wird. One function serves one purpose, also eine Funktion, ein Zweck. Die aufrufende Funktion sollte das Ergebnis auswerten und entsprechende Maßnahmen durchführen.
    Im übrigen ist die Intervallüberprüfung für (70,90] falsch.
    Sehe ich das richtig, dass du für jeden Zustand eine eigene Variable hast? Das solltest du auch schleunigst ändern und stattdessen nur eine einzige benutzen. Was ist denn, wenn r, F1 und F2 true sind?
    Je länger ich mir das ansehe, desto mehr habe ich den Eindruck, dass du dein ganzes Konzept noch einmal überdenken solltest.



  • ich muss ja auch 3 verschiedene variablen haben. wie soll ich den sonst dann beim image die einzelnen zustände unterscheiden?



  • könntet ihr mir vielleicht, ein paar Tipps oder Teillösungen zum ansporn geben?

    MFG lord-newbie



  • Hallo

    ich muss ja auch 3 verschiedene variablen haben. wie soll ich den sonst dann beim image die einzelnen zustände unterscheiden?

    Du brauchst nur eine Variable, die die drei verschiedenen Werte (0 bis 2) annimmt.
    z.B. 0=grün, 1=gelb, 2=rot.

    WilliW


Anmelden zum Antworten