试图用随机数制作一个for循环?

时间:2013-12-19 22:29:01

标签: java for-loop random

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

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

它只返回0,因为有许多名称。我很确定我已经搞砸了很多,但是感谢任何帮助:)

5 个答案:

答案 0 :(得分:1)

Math.random()会在0.01.0之间返回双倍值,因此即使您将其与kids.size()相乘,如果大小为&lt; <1000,则会乘法结果仍然是less than 1,因此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,下次分配前,检查{ {1}},否则指定此席位。

答案 1 :(得分:0)

尝试类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);
}

答案 2 :(得分:0)

Math.random()会返回一个双精度数,然后您将转换为整数,该整数将结果置于最后。因此,你的尺码是否大于1?如果是这个问题,只需在转换为整数之前递增表达式:(int) (Math.random()* kids.size() + 1)

答案 3 :(得分:0)

尝试使用:

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

唯一的问题是,这并不能确保您的数字是截然不同的。如果这是令人担忧的,请说明您的问题。

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

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

@peter的while()循环可以很好地完成。

答案 4 :(得分:0)

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

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

假设kidsArrayList<String>,您可以这样做:

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