我正在尝试制作一个for循环,为用户输入的每个名字提供一个随机的座位号。所以用户告诉我名字,以及有多少座位,我需要制作一个for循环,随机分配每个名字一个随机的座位?这就是我正在做的事情,但我不确定如何做到这一点:
for(seats=1; seats<=kids.size(); seats++)
{
int result=(int)(Math.random()* (kids.size()) );
System.out.println(result);
}
它只返回0,因为有许多名称。我很确定我已经搞砸了很多,但是感谢任何帮助:)
答案 0 :(得分:1)
Math.random()
会在0.0
和1.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相关联。这样,您可以确保您使用的所有随机数都是唯一的。
假设kids
是ArrayList<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
只是语法糖,但在这种情况下,它会提高代码的可读性。