这个问题与我尝试编码的视频游戏有关。
我试图生成具有年龄,性别,宗教,收入等特征的人,这样每个属性都以特定的方式分布在人们中间。目前我正在使用一个存储对象的地图(具有与特定特征相对应的特定整数键)。
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的性别,高斯年龄分布和自定义宗教分布。
这很重要,因为我希望能够对它们进行轮询,并根据它们的不同特征获得响应。我该怎么做?
答案 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