如何阻止随机数生成器在 ABAP 中生成重复数

How to stop a random number generator from generating duplicate numbers in ABAP

提问人:JaggermanJanssen 提问时间:11/16/2023 最后编辑:Sandra RossiJaggermanJanssen 更新时间:11/17/2023 访问量:46

问:

因此,我为一个研究项目拼凑了一个随机数生成器。它的作用是生成一个随机数,然后根据第一个数字的值生成更多的随机数。

到目前为止,它工作正常,我唯一需要它停止做的事情就是两次生成相同的数字。

DATA :
  lv_MinI  TYPE i VALUE 2,
  lv_MaxI  TYPE i VALUE 6,
  lv_RndI  TYPE i,
  lv_RndII TYPE i,
  lv_i     TYPE i VALUE 10.


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.
    CALL FUNCTION 'QF05_RANDOM_INTEGER'
      EXPORTING
        ran_int_max = lv_MaxI
        ran_int_min = lv_MinI
      IMPORTING
        ran_int     = lv_RndII.
    WRITE: / lv_RndII.
  ENDDO.
ENDDO.

输出如下:

5
4
6
4
3
4

我将如何停止生成数字 4 三次?

随机 ABAP

评论

2赞 Philipp 11/16/2023
顺便说一句:生成随机数的推荐方法是类。cl_abap_random

答:

6赞 Philipp 11/16/2023 #1

标准的伪随机数生成器被设计为看起来好像它没有受到先前事件的影响。这意味着它偶尔会输出重复的数字。就像骰子可以连续两次出现相同的数字一样。

如果你不想要重复的数字,那么你不应该掷骰子,你应该发牌。

我的意思是建立一个洗牌袋。

  1. 将所有可能的值放入内部表中lt_shufflebag
  2. 通过生成一个介于 1 和 之间的随机数,然后用于获取该表行中的值来绘制值lv_randlines( lt_shufflebag )READ TABLE lt_shufflebag INDEX lv_rand
  3. 删除该表行以删除您刚刚读取的行(该行之后的行将向下移动,因此该表最终少了一行)。DELETE TABLE lt_shufflebag INDEX lv_rand
  4. 不要忘记处理表为空的情况,因为您用完了所有条目。在这种情况下,您可能希望重新生成表。

评论

0赞 phil soady 11/20/2023
加上 1 用于免费概率课程和首选库。