Начните с:
int input = something;
int result = gsl_rng_uniform_int(r, input);
Вероятно, компилятор предупредит о небезопасном сужающемся преобразовании, поэтому измените на:
// 0 <= return value < input, so conversion is safe
int result = (int) gsl_rng_uniform_int(r, input);
Или для безопасности:
if (input <= 0) { panic(); }
unsigned long rawresult = gsl_rng_uniform_int(r, input);
if (rawresult > INT_MAX) { panic(); }
int result = (int) rawresult;
Эти строки могут быть заключены во вспомогательную функцию:
int gsl_rng_uniform_signed(const gsl_rng *r, int input) {
if (input <= 0) { panic(); }
unsigned long rawresult = gsl_rng_uniform_int(r, input);
if (rawresult > INT_MAX) { panic(); }
return (int) rawresult;
}
В любом случае тестирование вашего ввода, как правило, более полезно, чем тестирование вывода функций, на которые вы полагаетесь, и если вы доверяете gsl_rng_uniform_int
, то тестирования ввода достаточно.
[Правка: вау, Google очень агрессивно индексирует. Я просто искал, чтобы проверить, что gsl_rng_uniform_signed
уже не является функцией, и нашел себя.]