【问题标题】:Unique Random Integer Generator唯一的随机整数生成器
【发布时间】:2013-05-13 09:42:17
【问题描述】:

我正在尝试制作一个生成唯一数字的随机整数生成器。

有没有人知道这怎么可能?

【问题讨论】:

  • 我愿意,但你应该表明你确实尝试过一些东西......
  • @MitchWheat 不唯一意味着它不会是真正随机的?
  • 您所说的独特、全球独特或仅在您亲自创建后您不希望另一个相同是什么意思
  • 也许发布者想要一个 GUID?
  • @Thihara 整个序列将是有限集的随机排列。

标签: java random integer unique


【解决方案1】:

如果您的可能数字范围足够小,那么这非常简单且有用:

final List<Integer> sack = new ArrayList<>(RANGE);
for (int i = 0; i < RANGE; i++) sack.add(i);
Collections.shuffle(sack);

现在只需按顺序从sack 中拉出项目。

【讨论】:

    【解决方案2】:

    一个简单的算法是:

    1. 创建一个HashSet&lt;Integer&gt; set
    2. 生成随机数
    3. 如果不存在于set => 使用该随机数并将其存储在set
    4. 如果存在于set 中,则返回步骤 2

    请注意,由于唯一性约束,数字不会真正随机。

    【讨论】:

    • 这只是建议您不打算用尽集合的情况,因为随着未击中的数字越来越少,性能会令人痛苦地下降。
    【解决方案3】:

    如果您要查找的是全局唯一标识符,您可能需要考虑 java 的 UUID 类,该类生成的 ID 只会在全世界创建一次,永远不会

    import java.util.UUID;
    
    public class Test {
        public static void main(String[] args) {
    
            System.out.println(UUID.randomUUID());
        }
    }
    

    但是,它是字母数字而不是整数

    【讨论】:

    • @user2375278 哈哈,很公平。你现在明白为什么我想确切地知道你所说的独特是什么
    【解决方案4】:

    没有像唯一整数随机这样的东西。

    在最好的情况下,你被限制在 2 到 64 次方的女巫是相当大的数字。

    唯一值的问题在于您需要它们。它们对于单个应用程序运行是否必须是唯一的,还是必须在整个应用程序生命周期内保持唯一?

    因此,您将有很多方法来创建随机数生成器。 UUID 是一个选项,但 assyliasaproach 也很好,Fisher-Yates shuffle 也是一个很好的例子。

    您可以在此集合中添加类似的内容。

    1. 创建容器
    2. 按顺序放入n个整数。
    3. 随机播放容器中的项目。
    4. 按顺序读取元素。

    如果您选择了一个列表作为容器,您可以使用 Collections.shuffle() 对其进行随机播放

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2013-03-13
      • 2018-05-03
      • 2010-12-09
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多