当前位置: 首页 > 知识库问答 >
问题:

生成唯一随机数[重复]

管景天
2023-03-14

如何在1到9之间生成9个随机数,而不重复,一个接一个。它类似于:假设生成的第一个随机数是4,那么下一个随机数必须在[1,9]{4}中。我的第一种方法是将每个随机生成的数字添加到一个集合中,从而避免重复。但在更糟糕的情况下,比如我们已经生成了6个数字,我们必须再生成3个数字,这个过程会有点慢。当范围从[1,9]更改为[1,1000]时,这种方法听起来不正确。有人能提出一个替代方法吗。

共有3个答案

计光赫
2023-03-14

以下是两种可能的方法:

方法1:-

  1. 将所有数字放入大小为n的数组。
  2. 从索引中随机选择一个数字i=rand(0,大小)
  3. 打印arr[i]
  4. 交换arr[i]和arr[size-1]
  5. 大小=大小-1
  6. 重复1到5次,直到列表用尽

时间复杂度:O(N)

空间复杂度:O(N)

方法二:

  1. 选择K的池大小
  2. 生成K个随机整数。
  3. 将它们显示为第一个k结果。
  4. 将它们添加到hashset中。
  5. 将池中所有前一个整数的所有ak 1相加。
  6. 如果不在hashset中,则添加1。
  7. 从池中随机选择一个整数r并显示出来。
  8. 如果r 1不在hashset中,则将其添加到池中
  9. 做7到8次直到水池用完。

时间复杂度:O(N)

空间复杂性:O(K)

赞成

方法1:对小整数范围使用此方法,因为它需要更大的空间,但速度非常快且随机。

方法2:在较大范围内使用此方法,因为它需要html" target="_blank">内存O(K),这是您的选择。k值越高,生成的数字的随机性就越高。因此,你可以通过保持良好的速度,在空间和随机性之间实现很好的平衡。

杜炫明
2023-03-14

如果您对实现自己的算法不感兴趣,可以使用已经在Java库中实现的简单方法。

您可以创建一个集合(一个排序的列表)包含整数开始结束,其中开始=1结束=9),然后使用方法集合。洗牌(列表) ,例如:

static List<Integer> randArray(int start, int end) { //specify start/end
    List<Integer> randList=new ArrayList<>(end-start+1); //create list
    for (int k=start;k<=end;k++) { //generate integers in order
        randList.add(k); //add integers to the list
    }        
    Collections.shuffle(randList); //reoder randomly the list
    return randList; //return the list with items in random order
}

shuffle方法只是随机地重新排列列表中的项目。

融宏伟
2023-03-14

从一个排序数组开始(通过for循环很容易创建);然后将每个数组元素与另一个(随机选择的)元素交换。为了避免评论中讨论的偏差,另一个元素的索引必须等于或高于第一个元素的索引。如果索引相等,则不交换元素。(这个答案的原始版本包含了一句关于元素被交换回的可能性的句子,但现在已经过时了,因为在突出显示的修改中,这种情况不会再发生了)

 类似资料:
  • 问题内容: 我正在尝试获取0到100之间的随机数。但是我希望它们是唯一的,而不是在序列中重复。例如,如果我有5个数字,它们应该是82,12,53,64,32而不是82,12,53,12,32(我使用了这个数字),但是它在序列中生成相同的数字。 问题答案: Add each number in the range sequentially in a list structure. Shuffle i

  • 问题内容: 我正在开发一个需要生成一些唯一编号的应用程序,并且实际上没有预定义的限制,因此使用Java UUD生成器并且运行良好。现在,我们对生成12位唯一的随机数有了新的要求。 谁能指出我实现这一目标的一些好的方法/算法,因为我看不到UUID生成数字中的任何可能性。 提前致谢 问题答案: 通过调用生成每个数字。为了保持唯一性,您可以通过将随机数保存在集合中并检查集合中是否包含您每次生成的数字来跟

  • 问题内容: 我想在0-500范围内创建10个随机数。但是问题是我希望这些数字是唯一的。对于2个随机数,我可以创建以下内容: 但是,如果我这样做10次,我认为它会堆叠。我之所以这样说是因为我正在尝试创建一个巨大的算法,该算法试图进行连续评估,我希望连续获取10个随机且唯一的数字。我不知道该怎么办。有什么想法或建议吗? 问题答案: 每当您使用Fisher-Yates shuffle 来使用数字时,请从

  • 问题内容: 我需要生成一个范围内的随机唯一数字吗?怎么做 ? 我可以通过生成随机数 我知道这段代码不好,所以我需要一个更好的优化版本代码!帮帮我 ! 例如:如果我需要在1到15之间生成3个数字,它们应该像5、9、1而不是3,1,2 [具有1-3(我要生成的数字)] 问题答案: 以随机顺序排列数字范围的数组: 包装功能: 例: 结果:

  • 问题内容: 我上面有一个方法,该方法应生成用户指定的随机元素数组。随机生成的整数应介于0到10之间(含0和10)。我能够生成随机整数,但是我遇到的问题是检查唯一性。我尝试检查唯一性是在上面的代码中,但是数组仍然包含整数的重复项。我做错了什么,有人可以给我提示吗? 问题答案: 您确实找到重复的值。但是,您将其替换为另一个可能重复的随机数。相反,请尝试以下操作: 但是,这种方法效率低下。我建议列出数字

  • 问题内容: 我正在尝试使用下面的代码来生成10位唯一的随机数。根据我的要求,我必须创建大约5000个唯一编号。这无法正常工作。它还会生成- ve数字。同样,有时生成的数字中缺少一两位数字,导致8或9个数字而不是10。 问题答案: 我认为您获得8/9位数字值和负数的原因是您要添加一个(带符号的64位值),该值可能大于的正数范围(32位值)。 该值正在溢出,处于负32位范围内或几乎缠绕到(由于是带符号