【问题标题】:Generate Random Array of Letters/Numbers, but can't use the same letter/number twice [duplicate]生成字母/数字的随机数组,但不能两次使用相同的字母/数字[重复]
【发布时间】:2025-12-24 21:30:12
【问题描述】:

Generating Unique Random Numbers in Java 非常相似。但是有字母和数字,而不仅仅是数字。

那么我将如何处理“生成字母/数字的随机数组,但不能两次使用相同的字母/数字”。比如:

好: “ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890” “QWERTYUIOPASDFGHJKLZXCVBNM0246813579” 坏的: "AACDDFGHHJKLMMOPPRSTUVVWXY2335925523"

它需要包含字母表中的每个字母,但只能包含一次且顺序随机。

【问题讨论】:

  • 对链接问题的接受答案适用于任何项目集合,而不仅仅是数字。

标签: java


【解决方案1】:

拥有一组字符池,将它们随机排列,然后在每次需要随机字符时弹出一个。

【讨论】:

    【解决方案2】:
    1. 声明一个List<Char> 并将每个字母添加到其中,并为数字使用List<int>
    2. 使用Math.random() 获得一个随机数,最大长度为List
    3. 使用该编号从List 中获取相应的项目,然后将其从List 中删除
    4. 重复直到List.isEmpty() == true
    5. 对号码 List 执行相同操作。

    编辑:@alex 的答案可能更简单。

    【讨论】:

      【解决方案3】:

      另一种解决方案是创建一个包含您想要的所有字符的文本数组。

      例如 Char[] myArray = {"a","b" ..};

      然后从数组中获取随机索引并插入到 map 中,直到 map 的大小等于数组的大小。地图永远不会包含重复项,您将有许多随机组合。在这种情况下,映射的键和值可以相同。

      【讨论】:

      • 为此,您必须使用排序地图,例如LinkedHashMap。由于您对这些值不感兴趣,因此您也可以使用LinkedHashSet,它将条目保持在插入顺序中,但防止重复。
      • 总而言之,这个方法可能需要相当长的时间,甚至不能保证终止,因为已经插入集合的元素越多,插入一个已经存在的元素的概率就越高包含在集合中。