【问题标题】:Trying to make a for loop with random numbers?试图用随机数创建一个 for 循环?
【发布时间】:2013-12-19 22:29:00
【问题描述】:

我正在尝试创建一个 for 循环,为用户输入的每个名称提供一个随机座位号。所以用户告诉我名字,有多少个座位,我需要创建一个 for 循环,为每个名字随机分配一个随机座位?这就是我正在做的事情,但我不确定如何才能做到这一点:

for(seats=1; seats<=kids.size(); seats++)
{
    int result=(int)(Math.random()* (kids.size()) );
    System.out.println(result);
}

无论有多少名称,它都会返回 0。我很确定我在这方面搞砸了很多,但感谢任何帮助:)

【问题讨论】:

  • 请记住,将座位分配给某人后,该座位将无法再分配。因此,您不能只相信 Math.random() * kids.size() 会做正确的事情,除非您 a) 在分配孩子后将其移除,并且 b) 从座椅池中移除座椅。请注意:您的座位池在哪里?

标签: java for-loop random


【解决方案1】:

Math.random() 返回 0.01.0 之间的双精度值,所以即使你将它与 kids.size() 相乘,如果 size 为 converting to int would return 0。

例如,创建 0 到 99 之间的随机数的解决方法是:

(math.random()*10000)%100

另外,对于你的第二个要求,你可以有一个bit array of length equal to the maximum seat number,然后你可以生成random numbers less than this max seat number,无论分配哪个座位,set the bit in the array to 1,下次分配前,检查if bit is already 1, then generate again,否则分配这个座位。

【讨论】:

  • 但不是每次。 Math.random 是相当均匀的,而且 random * size 在统计上大部分时间不会是 0,而是介于 0 和 size 之间的某个值。
  • Math.random() 实际上返回 0.0 到 1.0(不是 0.1)之间的双精度数。
【解决方案2】:

Math.random() 返回一个双精度数,并且您正在转换为一个整数,这会使结果下降。因此,您的尺寸是否大于 1?如果这就是问题所在,只需在转换为整数之前增加您的表达式:(int) (Math.random()* kids.size() + 1)

【讨论】:

    【解决方案3】:

    试试Random 类(java std 库的一部分)。它允许您生成具有给定边界的随机整数。

    Random myGenerator = new Random();
    for(seats = 1; seats <= kids.size(); seats++) {
        int result = myGenerator.nextInt(kids.size());
        System.out.println(result);
    }
    

    但请记住,您需要额外的代码来确保生成的座位号是不同的。

    Random myGenerator = new Random();
    
    // keep track of the seats that are already taken
    List<Integer> takenSeats = new ArrayList<Integer>(kids.size());
    
    for(seats = 1; seats <= kids.size(); seats++) {
        int result = myGenerator.nextInt(kids.size());
    
        // keep trying until we get a distinct seat
        while(takenSeats.contains(result)) {
            result = myGenerator.nextInt(kids.size());
        }
    
        // now record that this seat is taken
        takenSeats.add(result);
    
        System.out.println(result);
    }
    

    【讨论】:

      【解决方案4】:

      尝试使用:

      Math.floor((Math.random()*kids.size())+1)
      

      唯一的问题是,这并不能确保您的数字是不同的。如果您对此感到担忧,请说明您的问题。

      作为记录,您可以使用多种算法。一种是将一种座位列表作为数组列表。然后,当有人获得座位时,将其从可用座位列表中删除。

      每次执行 for 循环时,都应该检查 Math.random 的结果,看看该结果是否在可用席位列表中。如果没有,请再次运行 Math.random。

      @peter 的 while() 循环会做得很好。

      【讨论】:

        【解决方案5】:

        首先,你应该使用Random类来生成你的数字,因为它允许你在一定范围内生成它们。

        其次,我建议使用Map(最常见的具体实现是HashMap)将您的随机数与您的座位ID 相关联。这样您就可以确保您使用的所有随机数都是唯一的。

        假设kidsArrayList&lt;String&gt;,您可以这样做:

        HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
        Random generator = new Random();
        for (String kid : kids) {
            int number = r.nextInt(kids.size());
        
            // if the number has been used already, generate a new one
            while (map.containsValue(number))
                number = r.nextInt(kids.size());
        
            // associate the kid (key) and number (value) in the HashMap
            map.put(kid, number);
        }
        

        使用 ehnance for-loop 只是语法糖,但在这种情况下,它将提高代码的可读性。

        更多信息:Random JavadocHashMap Javadoc

        【讨论】:

          猜你喜欢
          • 2021-04-11
          • 2017-10-14
          • 1970-01-01
          • 1970-01-01
          • 2012-09-21
          • 1970-01-01
          • 1970-01-01
          • 2020-08-03
          • 1970-01-01
          相关资源
          最近更新 更多