Seite 1 von 1

Zufallszahlenreihe generieren

Verfasst: 12.05.2006 21:47
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

Verfasst: 13.05.2006 03:22
von xperience2003
erm...gut

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

hrhr...sry