Я думаю, вам не нужно проходить через это, но одного раза достаточно, вот так:
unsigned int weighted_random_UINT()
{
float r2 = ((float)rand()/RAND_MAX)+1; // random float between 1 and 2
unsigned int k = 0;
while(rand() % 4 != 0) // 3/4 chance
{k = k < UINT_MAX ? k + 1: UINT_MAX;}
return (unsigned int)fpow(r2,(float)k) - 1;
}
Первая часть - это геометрическое распределение, а последняя - равномерное распределение.
А ты хочешь (1+U(0,1))^G(3/4)
.
Должна быть возможность найти более быстрый способ найти G (3/4).
Edit:
Я нашел это в Википедии:
http://en.wikipedia.org/wiki/Geometric_distribution#Related_distributions
G(p)=floor(ln(U)/ln(1-p))
Таким образом, вы хотите:
U^floor(ln(U)/ln(1-3/4))
Что должно быть всего два вызова к рэнду.