Zufallszahlen erzeugen

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo knubbl,

das Siemens-Beispiel ist ein bisschen misverständlich. Deshalb mal meine Auslegung:

Code:
 CALL  "TIME_TCK"
       RET_VAL:=#DTime

      L     #DTime
      ABS   
      L     #Obergrenze                 // höchste zufallszahl
      MOD   
      T     #Zufallszahl

Dabei ist #DTime eine Temp-Variable vom Typ Time
#Obergrenze IN-Variable als INT
#Zufallszahl OUT-Variable als INT

Grüße
Gebs
 
einfach:

Code:
*
      L     #iRandomNumber
      +     1
      T     #iRandomNumber
      L     #iRandomMax
      ==I   
      SPBN  none
      L     0
      T     #iRandomNumber
none: NOP   0

manuelle Reproduzierbarkeitschance bei relativ kleinem #iRandomMax nahe 0

also als würfel echt ne alternative :rolleyes:
 
Hallo knubbl,

ich hab' das mal ausprobiert mit ner Obergrenze von 100.
Da bekommt man die letzten zwei Stellen der Zeit raus. Ist nicht gerade zufällig.
Das mit ABS ist schwachsinnig, da die Zeit eh positiv ist.
Wenn Du aber ABS durch DTR ersetzt bekommt man wirklich Zufallszahlen.

Grüße
Gebs
 
Hallo , ich habe mir mal eine Baustein in SCL geschriben

Code:
//  LK @ 07. Juli 2008
{Scl_OverwriteBlocks        := 'y'}   // Overwrite the blocks
{Scl_GenerateReferenceData  := 'y'}   // Generate reference data
{Scl_S7ServerActive         := 'y'}   // Take the "S7_server" server attribute into consideration
{Scl_CreateObjectCode       := 'y'}   // Create the object code
{Scl_OptimizeObjectCode     := 'y'}   // Optimize the object code
{Scl_MonitorArrayLimits     := 'n'}   // Monitor the array limits
{Scl_CreateDebugInfo        := 'y'}   // Create the debug info
{Scl_SetOKFlag              := 'n'}   // Set the OK flag
{Scl_SetMaximumStringLength := '254'} // Maximal string length
FUNCTION_BLOCK FB31
TITLE = 'RND_x'
// Generiert eine Zufalzzahl
VERSION : '1.0'
AUTHOR  : lk
NAME    : RND_x
FAMILY  : S7SYSTEM
//KNOW_HOW_PROTECT
VAR_INPUT   // Eingangsparameter
    RND_MAX : INT;
    RND_MIN : INT;      
END_VAR
VAR_OUTPUT  // Ausgangsparameter
    RND_x   : INT;
END_VAR
VAR         // statische Variablen
    q       : DINT := 0;
END_VAR
VAR_TEMP    // temporäre Variablen
    x       : REAL;
    y       : REAL;
    z       : DINT;
END_VAR
CONST       // Konstanten
    a       := 1664525;
    b       := 2147483647;
    c       := 1013904223;
END_CONST
    // Anweisungsteil
    z := TIME_TO_DINT(TIME_TCK());  // TIME_TCK = SFC 64
    ;
    IF q = 0 THEN
        q := z;
    END_IF
    ;    
    q := (a * (q + z) + c) MOD b;
    x := DINT_TO_REAL(q) / DINT_TO_REAL(b);
    y := x * INT_TO_REAL(RND_MAX - RND_MIN);
    ;
    RND_x := REAL_TO_INT(ABS(y)) + RND_MIN;
END_FUNCTION_BLOCK

viel Spaß damit
Gruß Tommy
 
Das wirst du Wissen wenn du mal eine brauchst^^ Also ich brauch jetzt z.B. Mal welche für ein Beispielprogramm. Aber in der Praxis fällt mir jetzt auf Anhieb auch nix ein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wozu braucht man zufallszahlen

wir nutzen zufallszahlen und zufallstimer extensiv zum testen von bausteinen / anlagen

auch bei komplexen kommunikationen über bussen wird zufallszahl /zeit benötigt denn wenn es eine kollision auf dem bus gibt müssen zufällige wartezeiten erzeugt werden.

mir fallen da noch zahlreiche andere beispiele ein wie z.b beschicken von bändern mit mehreren beschickern, auch hier ist zufällige wartezeit sinnvoll um einen lockup der anlage zu vermeiden.

in der oscat lib haben wir deshalb bausteine für real, integer und bitmuster zufallszahlen sowie zufalls timer und pulsgeneratoren
 
Zurück
Oben