PB - Random Funktionen erweitern, Engine Wahl.

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

PB - Random Funktionen erweitern, Engine Wahl.

Beitrag von cxAlex »

Servus.

Ein kleiner Source um die PB - Random Funktionen zu erweitern oder besser gesagt die dahinter liegende Engine zu wählen.
Einfach einbinden, die normalen PB - Funktionen 'Random()' und 'RandomSeed()' werden überschrieben, in den Default - Einstellungen wird aber weiterhin die normale PB - Engine verwendet. Des weiteren gibt es nun die neue Funktion Random_SelectEngine(Engine) die folgende Parameter akzeptiert:
#Random_PB
#Random_glibc
#Random_ANSIC
#Random_BorlandC_rand
#Random_BorlandC_lrand
#Random_MVCpp
#Random_MVB6
#Random_PB und jede ungültige Eingabe führen dazu das auf die normale PB - Engine zurückgefallen wird, ansonsten wird die jeweils gewählte Engine emuliert.
Wenn eine alternative Engine verwendet wird sorgt (der sonst sinnlose Befehl) Random(0) dafür das sich die Funktion so verhält wie rand().

Random.pbi:

Code: Alles auswählen

; Extends Random Funtion to use different Engines

; EnableExplicit

Enumeration
  #Random_PB
  #Random_glibc
  #Random_ANSIC
  #Random_BorlandC_rand
  #Random_BorlandC_lrand
  #Random_MVCpp
  #Random_MVB6
EndEnumeration

;- Internal

Prototype ___rSeed(Seed.i)
Prototype.i ___Random(Max.i, Min.i = #Null)
Prototype.i ___rTruncator(Value.i)

Global ___rValSeed.i
Global ___rSeed.___rSeed
Global ___Random.___Random
Global ___rTruncator.___rTruncator
Global ___rand_a.i
Global ___rand_c.i
Global ___rand_m.i

Procedure ___RandomSeed_PB(Seed.i)
  RandomSeed(Seed)
EndProcedure

Procedure ___Random_PB(Max.i, Min.i)
  ProcedureReturn Random(Max, Min)
EndProcedure

Procedure.i ___rTruncator_none(Value.i)
  ProcedureReturn Value
EndProcedure

Procedure.i ___rTruncator_glibc(Value.i)
  ProcedureReturn Value & ((1 << 31) - 1 )
EndProcedure

Procedure.i ___rTruncator_ansic(Value.i)
  ProcedureReturn Value & ( ((1 << 31) - 1 ) ! ((1 << 16) - 1 ))
EndProcedure

Procedure.i ___RandomSeed_n(Seed.i)
  ___rValSeed = Seed
EndProcedure

Procedure.i ___Random_n(Max.i, Min.i = #Null)
  Max = Max - Min
  ___rValSeed = (___rValSeed * ___rand_a + ___rand_c) & ___rand_m
  If Max
    ProcedureReturn Min + ___rTruncator(___rValSeed)%(Max+1)
  Else
    ProcedureReturn ___rTruncator(___rValSeed)
  EndIf
EndProcedure

;- Public
Procedure Random_SelectEngine(Engine.i, Seed = 0)
  Select Engine
    Case #Random_PB
      ___rSeed = @___RandomSeed_PB()
      ___Random = @___Random_PB()
    Default
      ___rSeed = @___RandomSeed_n()
      ___Random = @___Random_n()
      Select Engine
        Case #Random_glibc
          ___rand_a = 1103515245
          ___rand_c = 12345
          ___rand_m = (1 << 31) - 1
          ___rTruncator = @___rTruncator_glibc()
          
        Case #Random_ANSIC
          ___rand_a = 1103515245
          ___rand_c = 12345
          ___rand_m = (1 << 31) - 1
          ___rTruncator = @___rTruncator_ansic()
          
        Case #Random_BorlandC_rand
          ___rand_a = 22695477
          ___rand_c = 1
          ___rand_m = (1 << 32) - 1
          ___rTruncator = @___rTruncator_ansic()
          
        Case #Random_BorlandC_lrand
          ___rand_a = 22695477
          ___rand_c = 1
          ___rand_m = (1 << 32) - 1
          ___rTruncator = @___rTruncator_glibc()
          
        Case #Random_MVCpp
          ___rand_a = 214013
          ___rand_c = 2531011
          ___rand_m = (1 << 32) - 1
          ___rTruncator = @___rTruncator_ansic()
          
        Case #Random_MVB6
          ___rand_a = 1140671485
          ___rand_c = 12820163
          ___rand_m = (1 << 24) - 1
          ___rTruncator = @___rTruncator_none()
          
        Default
            ___rSeed = @___RandomSeed_PB()
            ___Random = @___Random_PB()
      EndSelect
  EndSelect
  ___rSeed(0)
EndProcedure : Random_SelectEngine(#Random_PB)

; Override Original PB - Functions

Macro RandomSeed(Seed)
  ___rSeed(Seed)
EndMacro

Macro Random(Max, Min = #Null)
  ___Random(Max, Min)
EndMacro











; test

Macro TestVect()
  Debug "------"
  Define i
  For i = 1 To 10
    Debug Random(100)
  Next
EndMacro



Random_SelectEngine(#Random_PB) : TestVect()
Random_SelectEngine(#Random_glibc) : TestVect()
Random_SelectEngine(#Random_ANSIC) : TestVect()
Random_SelectEngine(#Random_BorlandC_rand) : TestVect()
Random_SelectEngine(#Random_BorlandC_lrand) : TestVect()
Random_SelectEngine(#Random_MVCpp) : TestVect()
Random_SelectEngine(#Random_MVB6) : TestVect()
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86