乱数の話。

最近友人とFF13オプティマの話をしていて、
オプティマって全部で何種類ある?」とか「組合せ」とか「順列」の話から乱数の話になった。


友人「ファイアーエンブレムみたいなパラメータの成長率はどう実装する?」
私 「レベルアップ時にHPが80%で1アップとか?」
友人「そそ」
私 「とりあえず100までの乱数で80以下なら+1とか」

int rate = 80;
int r = ( rand() % 100 ) + 1; //[1,100]
if( r <= rate )
{
    hp ++;
}

友人「じゃ、ウルフのHP成長率120%はどうする?」
私 「かならず+1で、さらに20%で+1だよね」

int rate = 120;
if( rate >= 100 )
{
    hp ++;
    rate -= 100;
}
int r = ( rand() % 100 ) + 1; //[1,100]
if( r <= rate )
{
    hp ++;
}

友人「if文書くの嫌だなー。if使わなくても書けるよね」
私 「マジ?」
友人「サジ。」

int rate = 120;
int r = rand() % 100; //[0,99]
int add = ( rate + r ) / 100;   //[1,2]
hp += add;

私 「おお〜。なるほど。」


実際にはどう実装してるんですかね?
皆さんはどう実装しますか?