Code: Alles auswählen.
" min und max müssen nicht zwingend Konstanten sein
CONSTANTS:
c_min TYPE i VALUE 1,
c_max TYPE i VALUE 100.
" Random Generator erzeugen - Uhrzeit als seed, da sonst immer das Gleiche rauskommt!
DATA(o_random) = cl_abap_random=>create( CONV i( sy-uzeit ) ).
" float( ) gibt eine Gleitkommazahl zwischen 0 und 1 zurück
" Diese Formel ist eine beliebte Programmierübung
w_num = CONV i( c_min + o_random->float( ) * ( c_max - 1 ) ).
Code: Alles auswählen.
DATA(o_random) = cl_abap_random=>create( CONV i( sy-uzeit ) ).
Code: Alles auswählen.
o_random = cl_abap_random=>create( CONV i( sy-uzeit ) ).
Code: Alles auswählen.
DATA:
o_random TYPE REF TO cl_abap_random,
w_num TYPE i.
w_num = sy-uzeit.
o_random = cl_abap_random=>create( w_num ).
"...
w_num = c_min + o_random->FLOAT( ) * ( c_max - 1 ).
lausek hat geschrieben:Ich kann mir nichts vorstellen was an Klassen besonders sein soll. Darauf kommen wir dann zurück wenn du ein spezifisches Problem hast ^^
Das wäre jetzt auch kompatibel zu älteren Versionen:Code: Alles auswählen.
DATA: o_random TYPE REF TO cl_abap_random, w_num TYPE i. w_num = sy-uzeit. o_random = cl_abap_random=>create( w_num ). "... w_num = c_min + o_random->FLOAT( ) * ( c_max - 1 ).
Warum?Abapsocke hat geschrieben:Tatsächlich brauche ich aber zumindest Kommazahlen (auch wenn diese am Ende wieder gerundet werden) im Verlauf meiner Arbeit.
Dafür gibt es CL_ABAP_RANDOM_INT oder die Methode INTINRANGE in der Klasse CL_ABAP_RANDOM ( déjà vu )Abapsocke hat geschrieben:Was den zweiten Nachtrag betrifft: ja, ich brauche letztendlich Zahlen, so als würde ich sie auswürfeln. Klar wäre ein System gut, bei dem letztendlich alle Zahlen gleich häufig auftreten [...] Wenn es dafür aber eine einfache Lösung gibt, dann interessiert mich das natürlich sehr.
Soso - was genau weißt du denn da bzw. was sind das für Mittel - das würde mich gerade mal stark interessieren.Abapsocke hat geschrieben: da ich weiß das man im Bereich von Zufallsgeneratoren da noch mit ganz anderen Mitteln arbeiten kann.
Code: Alles auswählen.
*&---------------------------------------------------------------------*
*& Report ZTEST_TABLE_SEARCH
*&---------------------------------------------------------------------*
REPORT ZTEST_TABLE_SEARCH2.
DATA: T_OBJID TYPE STANDARD TABLE OF HROBJID WITH HEADER LINE,
I TYPE I,
J TYPE I,
RUNTIME TYPE I.
SELECTION-SCREEN COMMENT 1(83) TEXT-COM.
PARAMETERS: JN_FIRST RADIOBUTTON GROUP ONE,
SB_FIRST RADIOBUTTON GROUP ONE,
EX_FIRST RADIOBUTTON GROUP ONE.
*** START-OF-SELECTION ***
START-OF-SELECTION.
CASE 'X'.
WHEN JN_FIRST.
PERFORM SELECT_WITH_JOIN.
WRITE: / 'Join:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_SUBQUERY.
WRITE: / 'Subquery:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_EXISTS.
WRITE: / 'Exists-Clause:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
WHEN SB_FIRST.
PERFORM SELECT_WITH_SUBQUERY.
WRITE: / 'Subquery:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_JOIN.
WRITE: / 'Join:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_EXISTS.
WRITE: / 'Exists-Clause:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
WHEN EX_FIRST.
PERFORM SELECT_WITH_EXISTS.
WRITE: / 'Exists-Clause:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_SUBQUERY.
WRITE: / 'Subquery:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
PERFORM SELECT_WITH_JOIN.
WRITE: / 'Join:', RUNTIME, 'microseconds'.
WRITE: / LINES( T_OBJID ), 'table entries'.
ENDCASE.
*&---------------------------------------------------------------------*
*& Form SELECT_WITH_JOIN
*&---------------------------------------------------------------------*
FORM SELECT_WITH_JOIN.
GET RUN TIME FIELD I.
SELECT OBJID INTO TABLE T_OBJID FROM PA0001
JOIN HRP1001 ON HRP1001~SOBID = PA0001~PERNR
WHERE PA0001~WERKS = 'Z001'
AND PA0001~BEGDA <= SY-DATUM
AND PA0001~ENDDA >= SY-DATUM.
GET RUN TIME FIELD J.
RUNTIME = J - I.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECT_WITH_SUBQUERY
*&---------------------------------------------------------------------*
FORM SELECT_WITH_SUBQUERY.
GET RUN TIME FIELD I.
SELECT OBJID INTO TABLE T_OBJID FROM HRP1001
WHERE SOBID IN ( SELECT PERNR FROM PA0001
WHERE WERKS = 'Z001'
AND PA0001~BEGDA <= SY-DATUM
AND PA0001~ENDDA >= SY-DATUM ).
GET RUN TIME FIELD J.
RUNTIME = J - I.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SELECT_WITH_EXISTS
*&---------------------------------------------------------------------*
FORM SELECT_WITH_EXISTS.
GET RUN TIME FIELD I.
SELECT OBJID INTO TABLE T_OBJID FROM HRP1001
WHERE EXISTS ( SELECT PERNR FROM PA0001
WHERE PERNR = HRP1001~SOBID
AND WERKS = 'Z001'
AND PA0001~BEGDA <= SY-DATUM
AND PA0001~ENDDA >= SY-DATUM ).
GET RUN TIME FIELD J.
RUNTIME = J - I.
ENDFORM.
Ich hoffe du hast jetzt auch einen Beleg für diese Aussage und dass diese Zahlen tatsächlich besser zufallsverteilt sind als die Random-Klassen und auch dass man damit gut Zufallszahlen im Bereich zwischen 1 und 1.000.000 erzeugen kannDeathAndPain hat geschrieben: hat man da im Milli- und Mikrosekundenbereich perfekte Zufallszahlen