2016-06-09 57 views
-1

这个问题属于我试图编码的视频游戏。生成具有正态分布属性的人物对象?

我试图创造出具有诸如年龄,性别,宗教,收入等特征的人,使得每个属性以特定方式分布在人们中间。目前我正在使用地图,它存储对象(具有与特定特征相对应的特定整数键)。

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

任何理由你正在使用'Map'而不是每个特征的实例变量?使用'Map'会给每个对象添加额外的开销,这会使每个Person对象的大小和速度都比它们的实例数据具有setter和getter的速度慢。 – 4castle

+0

你是什么意思的“自定义”分布?这是否像每个宗教的百分比值? – 4castle

+0

你会如何做到这一点?添加随机数生成以在其构造函数中设置每个“Person”的属性。 – pjs

回答

0

Random类将是非常有益的在这里,因为它提供了一个nextGaussian()方法,它返回浮点数的正态分布均值为0,发网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

+0

感谢您的回复,我会尽力实施它,然后再回来。 –

+0

它的工作,非常感谢你! –