ABAP随机数生成器重复生成相同数字的问题解决咨询
解决ABAP随机数重复问题的方案
方法一:用内表记录已生成数值,重复则重试
这种方法通过内表存储已生成的随机数,每次生成新数值后检查是否已存在,存在则重新生成,直到拿到未出现过的数值,适合数值范围较大的场景。
修改后的代码:
DATA : lv_MinI TYPE i VALUE 2, lv_MaxI TYPE i VALUE 6, lv_RndI TYPE i, lv_RndII TYPE i, lt_RndList TYPE STANDARD TABLE OF i, ls_RndList LIKE LINE OF lt_RndList. DO 1 TIMES. " 生成需要生成的随机数数量 CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = lv_MaxI ran_int_min = lv_MinI IMPORTING ran_int = lv_RndI. WRITE: / lv_RndI. ULINE. " 生成指定数量的不重复随机数 DO lv_RndI TIMES. DO. CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = lv_MaxI ran_int_min = lv_MinI IMPORTING ran_int = lv_RndII. " 检查当前数值是否已存在于列表 READ TABLE lt_RndList WITH KEY table_line = lv_RndII TRANSPORTING NO FIELDS. IF sy-subrc <> 0. APPEND lv_RndII TO lt_RndList. WRITE: / lv_RndII. EXIT. ENDIF. ENDDO. ENDDO. ENDDO.
方法二:构建数值池后打乱取数(更高效推荐)
由于你的数值范围仅为2-6,范围极小,先将所有可能的数值存入内表作为数值池,再通过系统函数打乱顺序,最后取前lv_RndI个数值,完全避免重复且无需循环重试。
修改后的代码:
DATA : lv_MinI TYPE i VALUE 2, lv_MaxI TYPE i VALUE 6, lv_RndI TYPE i, lv_RndII TYPE i, lt_NumPool TYPE STANDARD TABLE OF i, lt_RndList TYPE STANDARD TABLE OF i, lv_Index TYPE i. DO 1 TIMES. " 生成需要生成的随机数数量 CALL FUNCTION 'QF05_RANDOM_INTEGER' EXPORTING ran_int_max = lv_MaxI ran_int_min = lv_MinI IMPORTING ran_int = lv_RndI. WRITE: / lv_RndI. ULINE. " 构建数值池:将2到6的所有数值加入内表 DO lv_MaxI - lv_MinI + 1 TIMES. lv_RndII = lv_MinI + sy-index - 1. APPEND lv_RndII TO lt_NumPool. ENDDO. " 打乱数值池的顺序 CALL FUNCTION 'QF05_RANDOMIZE_TABLE' EXPORTING table_inout = lt_NumPool. " 取前lv_RndI个数值(若数量超过数值池总数,自动取全部) lt_RndList = lt_NumPool[ 1 TO lv_RndI ]. " 输出结果 LOOP AT lt_RndList INTO lv_RndII. WRITE: / lv_RndII. ENDLOOP. ENDDO.
补充说明
- 方法二逻辑更简洁,不会出现无限循环风险,当
lv_RndI等于数值池总数时,直接输出所有数值即可。 - 若后续调整数值范围导致
lv_RndI可能超过数值池总数,可添加判断lv_RndI = MIN( lv_RndI, lines( lt_NumPool ) ),确保取数不会超出范围。
内容的提问来源于stack exchange,提问作者JaggermanJanssen
相关产品推荐
相关产品推荐

