Есть много способов сделать это.
Если у вас все в порядке с меньшей степенью детализации (с большей вероятностью дублирования), то что-то вроде (в псевдокоде) rand() * n / RAND_MAX
будет работать для распространения значений по большему диапазону. Уловка в том, что в вашем реальном коде вам нужно избегать переполнения, либо путем приведения rand () или n к типу достаточно большого размера (например, 64-битному int, если RAND_MAX равен 0xFFFFFFFF), чтобы хранить результат умножения без переполнения, или используйте API умножения и деления (например, GNU MulDiv64 или Win32 MulDiv ), оптимизированный для этого сценария.
Если вы хотите получить гранулярность для каждого целого числа, вы можете вызвать rand () несколько раз и добавить результаты. Другой ответ предлагает вызвать rand () для каждого 8-битного / 16-битного / 32-битного блока в зависимости от размера RAND_MAX.
Но, ИМХО, вышеприведенные идеи могут быстро усложниться, неточны или и то, и другое. Генерация случайных чисел является решаемой проблемой в других библиотеках, и, вероятно, гораздо проще заимствовать существующий код (например, из Boost ), чем пытаться свернуть свой собственный. Алгоритм генерации случайных чисел с открытым исходным кодом в C ++? содержит ответы с большим количеством ссылок, если вы хотите что-то кроме Boost.
[РЕДАКТИРОВАТЬ: пересматривая после напряженного дня ... хотел вернуться и очистить мой быстрый ответ сегодня утром, но отстранился и вернулся только сейчас. :-)]