如何使我的房间分拣机更随机?

时间:2016-01-27 02:40:06

标签: java random

所以我正在开发一个程序,该程序应该随机地将人们放在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;
}

3 个答案:

答案 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)

您发布的代码可能有问题。 我已经用你的类可能构建了一个工作示例,并且它是随机分发的:

http://pastebin.com/u8sZRxi6

答案 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数组。