【问题标题】:Function to generate an array of random numbers with no repetitions [duplicate]生成不重复的随机数数组的函数[重复]
【发布时间】:2019-01-16 20:12:29
【问题描述】:

我正在创建一个函数来生成一系列随机且不重复的数字。我做错了什么?

使用此代码,函数会填充重复一些数字的数组。

for(int i=0;i<n;i++)
        {
          numero = random.nextInt(delta) + da;
          for(int j=0;j<n;j++)
          {
            if(numero==estratti[j])
            {
              numero = random.nextInt(delta) + da;
              j=0;
            }        
          }
          estratti[i] = numero;
        }

【问题讨论】:

  • 首先告诉我们它在做什么。
  • 只需创建一个具有所需范围的Array,然后随机播放它

标签: java arrays random


【解决方案1】:

如果您随机掷出一个重复号码,然后掷出一个新号码,然后随机掷出estratti[0],似乎会出现问题。当您找到重复项时设置j=0,但下次您检查numero==estratti[j] 是否在循环的下一次迭代中。到那时,j 已经从j++ 增加到1,因此你错过了这个案例。

要修复它,如果发现重复号码,您可以设置j = -1

【讨论】:

    【解决方案2】:

    您应该利用哈希集结构并执行以下未经测试的 java 代码:

    HashSet set = new LinkedHashSet();
    while (set.size() < n) {
        set.add(random.nextInt(delta));
    }
    return set.toArray();
    

    HashSet.add method 将不会添加已存在的值。

    根据您的情况调整该代码。

    【讨论】:

    • 虽然这会生成唯一的随机数,但通过执行set.toArray,这些数字将按排序顺序排列(按它们的哈希码排序,即它们自己)。最好将它们存储在一个列表或数组中,并使用该集合作为一种更快、更方便的方式来检查一个数字之前是否已经滚动。
    • 你是对的@tobias_k,这里有一个LinkedHashSet(保持插入顺序):docs.oracle.com/javase/9/docs/api/java/util/LinkedHashSet.html
    • 但是...不,toArray 不会返回按 hashCode 排序的生成数字。它们将根据它们在链表的后备数组中所占的位置进行排序。这与插入顺序不同,但仍然只是打乱了一些。您正在将 HashSet 与 SortedSet 混合在一起。
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    相关资源
    最近更新 更多