zufallsfunktion,



  • hallo

    hab ein projekt am laufen. und mir fällts schwer einige funktionen zu iomplementieren. es soll eigentlich so eine art ein virtuelles fließband ablaufen wo ich ein "gegenstand" mit seinem zustand sehe. (einfaches farbliches rechteck image)

    grün= alles okay
    gelb= kleiner fehler
    rot= grosser fehler

    dann wollte ich das noch nach der zeit machen, also wie sich eben ein fließband verhällt. also das jede z.B. 10 sekunden ein bauteil vorbeikommt bzw. mein image in der nach dem zufallsgenerator generierten farbe aufleuchtet.

    hab mir gedanken drüber gemacht aber jetzt hänge ich iwie fest.

    hier der code:

    /*int Zufallsfunktion (void)
    { // ?zufalssgenerator? mit der for-schleife wollte ich die häufigkeiten noch einstellen wie oft ein bauteil mit kleinem oder grossem fehler auftaucht. ach
    rand_max = 100;
    srand( rand_max);
    for (ii=0;ii<=rand_max ;ii++ )
    {
    ii = rand() % 100;

    // wenn ii kleiner 70 soll r=true zurückgegeben werden.
    if(ii<= 70)
    {
    return r=true;
    } else {return r=false;}

    // wenn ii zwischen 70 und 90 liegt soll f1=true zurückgegeben werden.
    if (ii<70 && ii<=90)
    {
    return f1==TRUE;
    }else {return f1==NULL;}
    // wenn ii zwischen 90 und 100 liegt soll f2=true zurückgegeben werden.
    if (ii>90)
    {
    return f2=TRUE;
    }else {return f2=NULL;}
    }
    return 0;
    }

    // hier ist es ganz wild.
    // ich will eigentlich das er mir für r,f1,f2 das image farblich anders
    // gestaltet. Mit dem Timer will ich erreichen das er jede 10 sec, den zufallsgenerator wieder anspringen lässt und mir das dann wieder farblich am image anzeigt. die ablaufzeit, also wie lange es dauert wollte ich auch im label anzeigen aber bei mir steht da immer null.

    void __fastcall TForm1::Button5Click(TObject Sender)
    {
    Timer1->Enabled=TRUE;
    Timer1->Interval = 1000*60*60
    8;

    if (Timer1->Enabled)
    {
    Image2->Canvas->Brush->Color = clGreen;
    Image2->Canvas->Rectangle(0,0,105,105);
    }
    if (Timer1->Enabled==FALSE)
    {
    Image2->Canvas->Refresh();
    Image2->Canvas->Brush->Color = clGreen;
    Image2->Canvas->Rectangle(0,0,105,105);
    }

    if (r == true)
    {
    Image2->Canvas->Brush->Color = clGreen;
    }
    if (f1 == TRUE)
    {
    Image2->Canvas->Brush->Color = clYellow;
    }
    if (f2 == TRUE)
    {
    Image2->Canvas->Brush->Color = clRed;
    }
    }*/
    //---------------------------------------------------------------------------

    könntet ihr mir bitte helfen...?

    MFG lord-newbie



  • Hallo,
    wieso machst du mit random nicht eine Zahl zwischen 1 und 3?
    Außerdem sind 10s 10.000ms, also ist wohl 1000*60*60*8 ein wenig zu viel 😉
    Grüße

    /Edit: Achja, benutze doch bitte zur besseren Lesbarkeit C/C++ Tags.



  • 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



  • 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