Zufallszahlenreihe generieren

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.
Bayernhans
Beiträge: 20
Registriert: 09.04.2006 15:56
Wohnort: Bayern

Zufallszahlenreihe generieren

Beitrag von Bayernhans »

Kleine Spielerei mit Zahlen: Aus einem Bereich von integer-Zhalen wird eine zufällige Reihe von Zahlen generiert, von der keine doppelt vorkommt.
Beispiel für Verwendung von Arrays, Gadgets, Pointer, Prozeduren, usw.
Bitte rumschnipseln und verbessern und ???
Jeder comment ist willkommen!
Wünsche puren Spass

Code: Alles auswählen

; Zufällige Reihe von Zahlen aus dem Bereich a - b (integer), die nicht doppelt vorkommen
;
; hier im Beispiel (= Vorbelegung): "Würfeln" der Zahlen 1 .. 6
;
; PB-Version: 3.93
; 05/2006 by 'Bayernhans'

Global MinValue
Global MaxValue
#Button1 = 1 

;###################################
; Ermittelt Zufallszahl im Bereich von Min bis Max mit ganzen Zahlen (Source: PB Forum ...)
Procedure MyRandom(Min.l, Max.l) 
  ProcedureReturn Random(Max - Min) + Min 
EndProcedure  ; MyRandom

;###################################
Procedure DeleteL(DIR.l,ELEM.l,DM.l) ;(Source: PB Forum ...)
  ; DIR.l ist das Array in dem das Item ELEM.l gelöscht wird. Die Größe des Arrays ist DM
  CopyMemory(DIR+(ELEM+1)*4,DIR+ELEM*4,(DM-ELEM)*4) 
  PokeL(DIR+DM*4,0) 
EndProcedure 

;###################################
Procedure FillArray(a, b)
  Dim T_Array.l(b-a) ; Für den Bereich a-b Array dimensionieren ( Achtung! Erstes Element hat Index = 0 ) und ...
  For z = a To b
    T_Array(z-a) = z ; und aufsteigend von a nach b mit integer-Werten füllen
  Next
EndProcedure ; FillArray

;###################################
Procedure Randomize(a, b)
  Dim H_Array.l(b-a) ; gleich großes Hilfs-Array dimensionieren
  For x = 0 To (b-a)
    R_Value = MyRandom(MinValue-a, MaxValue-a) ; Zufallswert ermitteln und ...
    H_Array(x) = T_Array(R_Value)  ; dem Hilfsarray zuweisen
    DeleteL(T_Array.l(), R_Value, (b+1-a)) ; Element aus T_Array löschen, um keine doppelte Zahlen zu haben
    MaxValue = MaxValue - 1 ; Wertebereich um eins verringern, da schon ein Element gezogen wurde
    AddGadgetItem(10, -1, Str(H_Array(x))) ; Wert ins ListGadget jeweils am Ende (-1) schreiben
  Next
EndProcedure

;############ MAIN #################
If OpenWindow(0, 0, 0, 400, 400, #PB_Window_SystemMenu | #PB_Window_ScreenCentered, "Zufallswerte in einer Reihen von a - b (integer)") 
  If CreateGadgetList(WindowID(0)) 
    TextGadget(4, 10, 20,450,20,"Im Bereich a - b Zahlenreihen ohne doppelte Zahlen generieren")
    ButtonGadget(#Button1, 200, 350, 100, 25, "Reihe generieren")
    TextGadget(20,10, 40, 80, 20, "Unterer Wert (a):")
    StringGadget(2, 100, 40, 25, 20, "1")
    TextGadget(30,10, 60, 80, 20, "Oberer Wert (b):")
    StringGadget(3, 100, 60, 25, 20, "6")
    ListIconGadget(10, 10, 80, 104, 200,  "Zahlenreihe: ", 100)
  EndIf 
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_Gadget 
        Select EventGadgetID() 
          Case #Button1
            ClearGadgetItemList(10)
            MinValue = Val(GetGadgetText(2))
            MaxValue = Val(GetGadgetText(3))
            If MinValue<0 Or MaxValue<0 Or MaxValue<=MinValue
              MessageRequester("Unzulässig !!", "a, b >= 0 und b > a") 
            Else
              FillArray(MinValue,MaxValue)
              Randomize(MinValue,MaxValue)
            EndIf
        EndSelect 
      Case #PB_Event_CloseWindow 
        Ende = 1 
        
    EndSelect 
  Until Ende = 1 
  End 
EndIf 
;############ End ##################
_____________________
mit codetags sieht's netter aus .. bobobo
xperience2003
Beiträge: 972
Registriert: 04.10.2004 18:42
Computerausstattung: Amiga, LinuxMint, Windows7
Wohnort: gotha
Kontaktdaten:

Beitrag von xperience2003 »

erm...gut

bin etwas verwöhnt , dachte bei >>myrandom<< an etwas anders als das
"ProcedureReturn Random(Max - Min) + Min"

hrhr...sry
amiga rulez...
Rebirth Software
Antworten