Here is one way. Suppose you want 0, 1, 2, 3 to have a distribution of 5%, 20%, 30%, 45%.
You can do it as follows:
double val = (double)rand() / RAND_MAX; int random; if (val < 0.05) // 5% random = 0; else if (val < 0.25) // 5% + 20% random = 1; else if (val < 0.55) // 5% + 20% + 30% random = 2; else random = 3;
Of course, this does not need to be done with a floating point. I just made it this way because it is more intuitive.
source share