所以我正在开发一个程序,该程序应该随机地将人们放在6个房间(最终输入是每个房间里的人员列表)。所以我想出了如何做到这一切。
//this is the main sorting sequence:
for (int srtM = 0; srtM < Guys.length; srtM++) {
done = false;
People newMove = Guys[srtM]; //Guys is an array of People
while (!done) {
newMove.rndRoom(); //sets random number from 4 to 6
if (newMove.getRoom() == 4 && !room4.isFull()) {
room4.add(newMove); //adds person into the room4 object rList
done = true;
} else if (newMove.getRoom() == 5 && !room5.isFull()) {
room5.add(newMove);
done = true;
} else if (newMove.getRoom() == 6 && !room6.isFull()) {
room6.add(newMove);
done = true;
}
}
现在的问题是代码由于我不完全理解的原因(与我在这里写的方式有关)并不是随机的。几乎每次我运行程序时,似乎同样的人被放入同一个房间。比如我,我几乎总是把这个程序和另一个朋友一起放到6号房间(有趣的是,我们都在Guys数组的末尾)。那么我怎样才能让它“真正”随机?还是比现在更随意?
提前致谢!
忘记提及“rndRoom()”确实在后台使用标准的Random方法(适用于4-6):
public int rndRoom() {
if (this.gender == 'M') {
this.room = (rnd.nextInt((6 - 4) + 1)) + 4;
}
if (this.gender == 'F') {
this.room = (rnd.nextInt(((3 - 1) + 1))) + 1;
}
return this.room;
}
答案 0 :(得分:0)
如果您希望它更随机,请尝试使用Random
方法执行某些操作,请执行以下操作:
Random random = new Random();
for (int i = 0; i < 6; i++)
{
int roomChoice = random.nextInt(5) + 1;
roomChoice += 1;
}
当然这不是您想要使用的代码,这只是一个如何使用Random
方法的示例,将其更改为您希望如何使用它。
另外,我random.nextInt(5) + 1;
的原因是因为如果random.nextInt(5) + 1;
从0 to 5
获取一个随机数,那么如果您需要1 to 6
中的数字,则需要添加1,非常自我解释。
另一方面,要获得“真正的”随机并不像看起来那么容易,当你生成一个“随机”数字时它会使用一个名为Pseudo random number generation
的东西,这个,基本上这些程序产生无穷无尽的串单位数字,通常在10位,称为十进制。当采用大的伪随机数样本时,集合{0,1,2,3,4,5,6,7,8,9}中的10个数字中的每一个都以相同的频率出现,即使它们不是均匀分布在序列中。
答案 1 :(得分:0)
您发布的代码可能有问题。 我已经用你的类可能构建了一个工作示例,并且它是随机分发的:
答案 2 :(得分:0)
好的,所以我弄清楚为什么结果看起来不是很随机。所以房间分拣机的工作原理是按18个人的字母顺序排列。只有3个房间(4号房,5号房和6号房)所以每个人有1/3的机会可以说是房间6.但每个人只能在每个房间的6个景点中的2个(取决于他们在列表中的位置。)
前两个人,例如,每个人都可能只在每个房间的第一个或第二个位置。 “点”是指他们在最后打印的房间列表中的位置。另一方面,我在名单上排名倒数第二,所以此时我只能在每个房间的最后一个或第二个位置。
很抱歉,如果它令人困惑,但我发现这就是生成的房间列表看起来不是非常随机的原因 - 这是因为每次只有相同的几个人可以放在每个房间点。这些列表是随机的,它只是人们在每个列表中出现的非随机顺序。
因此,为了使列表看起来更随机,我不得不随意让人们在房间里的位置。所以我解决这个问题的方法是添加一个混合Person数组的shuffler动作:
public static void shuffle(Person[] arr) {
Random rgen = new Random();
for (int i = 0; i < arr.length; i++) {
int randPos = rgen.nextInt(arr.length);
Person tmp = arr[i];
arr[i] = arr[randPos];
arr[randPos] = tmp;
}
}
TL; DR生成的房间列表是随机的 - 但由于放入房间的人的顺序不是随机的,结果看起来并不是随机的。为了解决这个问题,我改组了Person数组。