2015-03-18 1 views
-1

Итак, в моем симуляторе я пытаюсь более точно контролировать, какой шанс для пола будет существо, когда оно будет создано. Первоначально у меня просто был прямой 50-процентный шанс для каждого использования RND, однако я понимаю, что это вызовет проблемы позже. Поэтому я думал о каждом создании существа и определении пола, я мог бы изменить/настроить% шансов для каждого пола на основе текущего соотношения, например. когда нынешняя популяция составляет 70% мужчин и 30% женщин. Таким образом, у следующего существа будет 70% шанс стать женщиной и сделать это так. Моя проблема заключается в том, что я борюсь с хорошим способом реализации этого какая-то информация ниже:Java: гендерный контроль

public void setGender2() { 
     int fper = gcount.get(ctype+Gender.F); int mper = gcount.get(ctype+Gender.M); 
     int tcc = fper + fper; 
     int gmf = rNum(0,100); //Calls the random number method. 
     if (fper == mper) { //When first used the total will be 0 so do this. 
      gchance = 50; 
      if (gmf <= gchance) g = Gender.F; //If the random number is less than the calculated gchance %. 
      else g = Gender.M; 
     } 
     else { 
      gchance = (int)(100-(((double)gcount.get(ctype+g)/(double)tcc)*100)); //Calculates the % for a gender. 
      if (fper < mper) { //When there is less females... 
       if (gmf <= gchance) g = Gender.F; 
       else if (gmf > gchance) g = Gender.M; 
      } 
      else if (mper < fper) { //When there is less males... 
       if (gmf <= gchance) g = Gender.M; 
       else if (gmf > gchance) g = Gender.F; 
      } 
     } 

     gcount.replace(ctype+g, gcount.get(ctype+g)+1); //update the count for this creature type + gender. 
} 

Пол информация хранится в HashMap называется gcount. Каждый тип существа & пол является ключевым, например. Рыба (ctype) + Пол - и затем значение, сохраненное вместе с ним, которое изменяется командой замены внизу.

Вещь реализует его таким образом, просто кажется очень ... неопрятным, поэтому надеясь, что у других были некоторые лучшие предложения ...?

Спасибо.

+0

Небольшое замечание: Ваши имена переменных не очень хороши. Использование понятных (и более длинных) имен сделает ваш код более читаемым. –

+5

Возможно, это тема для http://codereview.stackexchange.com/ ..? – svenhornberg

+0

bool isMale = Random.nextFloat()> (countAllMale/countAll) – ElDuderino

ответ

0

Я хотел бы попробовать что-то вроде этого ...

int males = 2; // <- your map value here 
int females = 1; // <- your map value here 

int total = males + females; 

double chanceMale = .5; 

if (total > 0) { 

    chanceMale = females/(double)total; 

} 

А потом просто сравнить случайное число chanceMale * 100, чтобы узнать, если это мужчина (в противном случае женщина).

+0

Конечно, выглядит лучше и эффективнее - попробует, спасибо Флориану :) –

0

Таким образом, остается только вопрос, как наилучшим образом применить шанс/процент, который я получаю от этого, чтобы определить, какой пол выбран. В настоящее время единственное, что я могу придумать, это:

int rgen = rNum(0,100) //(random number between 1 and 100). 
if (chanceMale > chanceFemale) { 
    if (rgen < chanceMale) g = Gender.M 
    else g = Gender.F 
} 
else if (chanceFemale > chanceMale) { 
    if (rgen < chanceFemale) g = Gender.F 
    else g = Gender.M 
} 
//Only issue is when rgen is equal to chanceMale/Female. 

Любые предложения по лучшему способу сделать это, если есть один ...?

Смежные вопросы