2016-06-09 52 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

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

相關問題