Code: Alles auswählen.
IF (eine Zahl zwischen 5-10) tue dies.
IF (eine andere zahl zwischen 1-10) tue auch noch das. Programmablauf mit vielen Details....
IF (eine weitere random zahl zwischen 1-10) tue auch noch jenes.
ENDIF
ENDIF
ELSE Progammablauf ohne weitere zwischenfälle
ENDIF
Code: Alles auswählen.
report zz_random_int.
data:
lo_ran type ref to cl_abap_random_int,
lv_i type i,
lv_seed type i.
lv_seed = sy-timlo.
lo_ran = cl_abap_random_int=>create( min = 5 max = 25 seed = lv_seed ).
lv_i = lo_ran->get_next( ).
write / lv_i.
Weil sich sy-timlo nicht laufend ändert, sondern nur "auf Anfrage": Du solltest vorher den Befehl GET TIME einbauen. Der aktualisiert die ganzen Zeitfelder, darunter SY-TIMLO. Ansonsten rufst Du die Methode immer mit dem selben Seed auf und bekommst logischerweise auch immer dieselbe Zufallszahl.Abapsocke hat geschrieben:Irgendwie klappt es nicht. Habe nun folgenden Code. Aber auch hier bekomme ich beim erneuten Aufruf in der gleichen Laufzeit immer nur die selbe Zahl.
Code: Alles auswählen.
DATA: ls_starfighters TYPE ZLK_STARFIGHTERS,
l_num TYPE i,
t_num TYPE i.
t_num = 1.
*t_num ist nur für Testzwecke
WRITE: 'Dies ist ein Dummytext. Bei einem 1w10 Wurf passiert etwas bei 5-10, ansonsten ist die Begegnung harmlos.'.
call function 'Z_RAUMSCHIFF_RANDOM'
EXPORTING
MINATTACK = 1
MAXATTACK = 10
IMPORTING
W_NUM = l_num.
*l_num sollte sich bei jedem Aufruf ändern.
WRITE: l_num.
IF l_num GE 5.
WRITE: 'Deine lange Reise durch den Weltraum wird je unterbrochen:...'.
*Zweiter Funktionsbaustein call, wieder brauche ich eine neue Nummer. Derzeit ist das GET TIME im FUBA. Ich habe es aber auch hier versucht
* GET TIME.
call function 'Z_RAUMSCHIFF_RANDOM'
EXPORTING
MINATTACK = 1
MAXATTACK = 10
IMPORTING
W_NUM = l_num.
WRITE: / l_num, 'zweite Zufallszahl'.
Code: Alles auswählen.
FUNCTION z_raumschiff_random.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" REFERENCE(MINATTACK) TYPE ZLK_STARFIGHTERS-ANGRIFF DEFAULT 1
*" REFERENCE(MAXATTACK) TYPE ZLK_STARFIGHTERS-ANGRIFF DEFAULT 10
*" EXPORTING
*" REFERENCE(W_NUM) TYPE I
*"----------------------------------------------------------------------
DATA:
lo_ran TYPE REF TO cl_abap_random_int,
lv_seed TYPE i,
lv_minwert TYPE i,
lv_maxwert TYPE i.
lv_minwert = minattack.
lv_maxwert = maxattack.
GET TIME.
lv_seed = sy-timlo.
lo_ran = cl_abap_random_int=>create( min = lv_minwert max = lv_maxwert seed = lv_seed ).
w_num = lo_ran->get_next( ).
WRITE / w_num.
Code: Alles auswählen.
lv_i = cl_abap_random_int=>create( min = 1 max = 20 seed = conv #( sy-timlo ) )->get_next( ).
Was ist denn der Unterschied wenn ich diese Variablen global definiere? Das brauche ich doch sonst nur, wenn ich Programmübergreifend darauf zugreifen möchte. Also im Falle eines TopIncludes beispielsweise mit anderen Fubas. Das hat zwar durchaus einen Sinn wenn ich noch mehrere FUBAS erstelle, aber darüber hinaus?ewx hat geschrieben:
Das wäre jetzt ein gutes Beispiel für den Einsatz von globalen Daten.
LO_RAN könntest du global definieren (Entweder im Fuba als globale Variable im TOP-Include oder als globales Attribut einer Klasse) und einmal beim ersten Aufruf erzeugen.
LO_RAN sollte dann GO_RAN heißen.
In der Funktion brauchst du dann nur noch GO_RAN->GET_NEXT aufrufen und erhältst immer eine andere Zufallszahl.
Darüberhinaus hast du beim nächsten Fuba-Aufruf bereits das instantiierte Objekt GO_RAN und kannst einfach mit GET_NEXT die neue Zufallszahl abholen.Abapsocke hat geschrieben: Was ist denn der Unterschied wenn ich diese Variablen global definiere? Das brauche ich doch sonst nur, wenn ich Programmübergreifend darauf zugreifen möchte. Also im Falle eines TopIncludes beispielsweise mit anderen Fubas. Das hat zwar durchaus einen Sinn wenn ich noch mehrere FUBAS erstelle, aber darüber hinaus?
Keiner. ewx hat nicht aufgepasst und nicht bedacht, dass DATA-Befehle, die wie bei Dir zwischen FUNCTION und ENDFUNCTION stehen, immer globale Variablen deklarieren. Solche Variablen sind genauso global, als wenn sie im TOP-Include der Funktionsgruppe deklariert worden wären (nur dass sie vor dem DATA-Befehl naturgemäß noch nicht genutzt werden können).Was ist denn der Unterschied wenn ich diese Variablen global definiere?
Nicht nur. Die globalen Variablen eines Funktionsbausteins bzw. seiner Funktionsgruppe bleiben zwischen mehreren Aufrufen erhalten, auch wenn diese aus demselben Programm kommen. Beispielsweise kann Dein Fuba zwecks Performanceoptimierung eine Puffertabelle nutzen, die er bei seinem ersten Aufruf füllt und dann bei allen weiteren Aufrufen schon parat hat. Das sieht dann in etwa so aus:Das brauche ich doch sonst nur, wenn ich Programmübergreifend darauf zugreifen möchte.
Code: Alles auswählen.
IF PUFFERTABELLE{}IS INITIAL. " müssen eckige Klammern sein (wenn die Tabelle keine Kopfzeile hat, dann kann man sie auch weglassen)
SELECT * FROM datenbanktabelle INTO PUFFERTABELLE.
ENDIF.
* Rest der Fuba-Logik
Der ist halt nur sekundengenau, bleibt also für eine ganze Sekunde konstant.Wie kann ich denn erreichen das ich jedes mal eine andere RAndomzahl erhalte? Es scheint ja dann daran zu liegen das der TIMLO sich nicht so schnell ändert, oder?
Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
Abapsocke