You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 01:46:02