Всегда ли значение RAND_MAX (2 ^ n) -1?

Меня интересует C ++, хотя я подозреваю, что он просто импортирует стандартное определение C. Я считаю, что стандарт говорит отрицательный ответ, но меня больше всего интересует практический ответ.

Если RAND_MAX всегда равен (2 ^ n) -1 (где n - некоторое натуральное число - в действительности количество случайных двоичных цифр в случайном числе), что упрощает решение проблемы, из-за которой недавно возник перенос кода из MinGW GCC в Linux GCC. RAND_MAX кажется больше (я не проверял, но, возможно, равен INT_MAX или какому-то другому символу), поэтому какой-то старый наивно написанный код RAND_MAX-not-big-so-work-around-it дал обратный эффект. Теперь мне нужно решить, насколько универсальной мне нужна эта библиотека, учитывая сложность написания кода, который правильно справляется с возможностью переполнения, не делая предположений, например, о ширине int.

В любом случае, существуют ли какие-либо достаточно широко используемые компиляторы C ++, которые используют что-то другое, кроме (2 ^ n) -1 для RAND_MAX?

Кроме того, я прав, что ((RAND_MAX | (RAND_MAX >> 1)) == RAND_MAX) всегда и только истинно, если RAND_MAX равно ((2 ^ n) -1) для некоторого целого числа без знака п. Я считаю, что RAND_MAX технически является int, но нет смысла иметь отрицательное или дробное значение, поэтому я думаю, что могу смело сбрасывать со счетов их. Битвы обычно меня не беспокоят, но я продолжаю думать, что выражение выглядит неправильно, и не могу понять почему.

Наконец, хотя я не буду счастлив, пока не получу работающее решение мой собственный, что следует использовать для случайных чисел, а не записывать их самому? Мне нужны случайные числа в диапазоне 0 <= x <параметр, и особенно мне нужны как можно более разумные вероятности для всех чисел. Например, использование (rand ()% upperbound) дает смещение в сторону меньших значений, особенно когда верхняя граница велика - я хочу этого избежать.

Есть ли для этого функция Boost или C ++ 0x?

РЕДАКТИРОВАТЬ

Следующее за чем-то в бите «Связанное» сбоку страницы показывает, что действительно существует способ получить случайные числа с заданными нижними и верхними границами при повышении.

9
задан Steve314 14 October 2019 в 16:09
поделиться