4

Here's my ramdomize code:

int monstername;
monstername = rand() % 3;

but I want 0 with 70% of output 1 with 20% 2 with 10% how I can do this with C?

Zach Saucier
  • 23,662
  • 12
  • 81
  • 137
Lucas Bertollo
  • 343
  • 2
  • 5
  • 17
  • 2
    There are already several good answers below, but you should really consider reading up on modulo bias. – Cloud Nov 06 '13 at 23:03

4 Answers4

4
int monstername;
int random_var = rand() % 10;

if(random_var < 7) {
    // 0-70%
    monstername = 0;
}
else if(random_var < 9) {
    // 70-90% here
    monstername = 1;
}
else {
    // 90-100% here
    monstername = 2;
}
Morten Jensen
  • 5,555
  • 3
  • 41
  • 54
3

Try

int monstername;
int rn = rand();

if (rn < 0.7*RAND_MAX)
    monstername = 0;
else if (rn < 0.9*RAND_MAX)
    monstername = 1;
else
    monstername = 2;
Musa
  • 93,746
  • 17
  • 112
  • 129
2

Assuming you don't care about modulo bias, you want something like:

int monstername;
int r = rand() % 10;

if (r < 7)
    monstername = 0;
else if (r < 9)
    monstername = 1;
else
    monstername = 2;

If you do care about modulo bias, look into arc4random_uniform(3) instead of rand(3).

Community
  • 1
  • 1
Carl Norum
  • 210,715
  • 34
  • 410
  • 462
1
int weighted[10] = {0,1,0,0,1,0,0,2,0,0};
monstername = weighted[rnd() % 10];
agbinfo
  • 753
  • 5
  • 16