使用正态分布的属性生成人物对象?

时间:2016-06-09 18:04:02

标签: java maps game-engine distribution

这个问题与我尝试编码的视频游戏有关。

我试图生成具有年龄,性别,宗教,收入等特征的人,这样每个属性都以特定的方式分布在人们中间。目前我正在使用一个存储对象的地图(具有与特定特征相对应的特定整数键)。

public class Person {
    Map<Integer, Object> personalAttributes;
}

我有另一个国家级。

public class State {
Person[] personArray = new Person[200];
//Instantiates a bunch of Persons and puts the into the array
}

然而,我希望人们有50/50的性别,高斯年龄分布和自定义宗教分布。

这很重要,因为我希望能够对它们进行轮询,并根据它们的不同特征获得响应。我该怎么做?

1 个答案:

答案 0 :(得分:0)

Random类在这里非常有用,因为它提供了一个nextGaussian()方法,它返回浮点数的正态分布,均值为0和stdev 1.0,你可以向上扩展和截断希望适合你的最大和最小年龄。

对于50/50分发,您可以在迭代时在两个性别之间切换,或者您可以再次使用Random类与nextBoolean()伪随机确定性别。

对于自定义分发,我假设您希望每个宗教中有一定比例的人口。只需在迭代时使用索引号来确定它们所处的宗教信仰。例如,您可以让宗教A有10%,索引为0 - 19,宗教B有50%,索引为20 - 119,宗教C有40%索引为120 - 199.(如果您希望自定义分布改为使用概率,请参阅this question

所有这些可能看起来像这样:

Random rand = new Random();
Person[] people = new Person[200];

for (int i = 0; i < people.length; i++) {
    Person p = new Person();
    people[i] = p;

    // Sex
    p.setSex(rand.nextBoolean() ? "Male" : "Female");
    // p.setSex(i % 2 == 0 ? "Male" : "Female");

    // Age (normal distribution with min 0, max 100, and mean 50
    int age = (int)(rand.nextGaussian() * 50);
    while (Math.abs(age) > 50)
        age = (int)(rand.nextGaussian() * 50);
    p.setAge(age + 50);

    // Religion
    int maxA = (int) (people.length * .1),
        maxB = (int) (people.length * .5) + maxA;
    if (i < maxA)
        p.setReligion("A");
    else if (i < maxB)
        p.setReligion("B");
    else
        p.setReligion("C");
}

// probably shuffle at the end so that religions aren't contiguous

Ideone Test