【问题标题】:Random numbers without duplicate [duplicate]没有重复的随机数[重复]
【发布时间】:2014-04-06 19:53:43
【问题描述】:
public class startOrder {


public static void main(String[] args) {
int[] start = new int[45];

for(int i=0;i<start.length;i++)
{
    start[i] = (int)(Math.random()*45);
}

for(int i=0;i<start.length;i++)
{
    System.out.println(start[i]);
}
}

}

我想制作一个简单的程序,只打印 1-45 之间的所有随机数。问题是它们之间有重复的数字,我怎样才能让它打印 1-45 之间的数字而没有任何重复。这是一个生成随机起始数字的程序。

【问题讨论】:

  • 只需将每个已生成的数字添加到数组/列表中,并与contains() 检查该数字是否已生成一次 - 然后跳过它。注意:如果您想生成从 1 到 40 的随机数,而边界从 1 到 41,这可能会导致性能不佳。

标签: java


【解决方案1】:

用首选数字填写一个列表,然后对其进行随机播放,例如使用下面的内置库函数。

List<Integer> myNumbers = Arrays.asList(1,2,3,4, etc.);
Collections.shuffle(myNumbers);

然后简单地遍历列表。

顺便说一句,这称为随机排列。

【讨论】:

  • +1 这是唯一不涉及在未知时间内生成不必要的随机数,从而降低效率的答案。
【解决方案2】:

你可以用 1-45 填充一个链表,然后从链表中反复删除一个随机选择的索引。

【讨论】:

    【解决方案3】:

    创建一个数组或某个集合,用数字填充它,然后使用两个随机数对其进行洗牌。

    【讨论】:

      【解决方案4】:
      1. 创建一个大小为 45 且所有位置都设置为 false 的布尔数组 bArray(这意味着该数字尚未被选取)。
      2. 每当您选择一个数字时,假设您选择了 15,请检查 bArray[15] 是否为假。如果是,请选择该数字并将 bArray[15] 分配为 true(这意味着该数字现在已被占用)。

      重复此操作,直到获得所有 45 个数字!

      【讨论】:

      • 有点低效...
      【解决方案5】:

      就这样使用 Set

      Set<Integer> start = new HashSet<Integer>();
      

      集合旨在消除重复值

      【讨论】:

        【解决方案6】:

        您可以使用HashSet!

        public static void main(String[] args)
        {
            Set<Integer> start = new HashSet<Integer>();
        
            while (start.size() <= 45)
            {
                start.add((int) (Math.random() * 45)+1);
            }
        
            for (int i: start)
            {
                System.out.println(i);
            }
        }
        

        Set 不允许重复,因此当您达到 45 的大小时,您将拥有 1 到 45 之间的所有唯一数字!另请记住,您的随机代码生成了一个介于 0-44 之间的数字,这是我修复的。

        【讨论】:

        • 好吧,它最终会起作用的......
        • @TonyHopkinson 是的,效率不高,但听起来像是学校作业,所以我试图保留他代码的精神。
        【解决方案7】:

        您应该查看TreeSet 和HashSet。这些集合不会存储任何重复项。

        在此处阅读有关它们的更多信息:

        HashSet ---> http://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html

        树集 ---> http://docs.oracle.com/javase/7/docs/api/java/util/TreeSet.html

        另外,请阅读另一篇关于 HashSet 与 TreeSet 的 Stackoverflow 帖子,我强烈建议您阅读它。阅读置顶评论:Hashset vs Treeset

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-27
          • 2020-01-05
          • 1970-01-01
          • 2023-03-19
          • 2011-05-01
          相关资源
          最近更新 更多