Другие языки программирования и технологии

C++ случайные числа

Вот проблема. Мне нужны все случайные числа, включая отрицательные. rand и srand позволяют только положительные генерировать. Как отрицательные сделать? P. S. Без заданного диапазона.
Вкратце:
все генераторы выдают некое количество (множество) значений, и эти значения попадают в некий интервал.
стандартный генератор rand() имеет множество значений RAND_MAX + 1 из диапазона [0 - RAND_MAX]
определен RAND_MAX так
#define RAND_MAX 0x7fff

И никакая арифметика над полученными значениями не может увеличить множество значений. Уменьшить - может.
Изменить диапазон значений можно с помощью арифметики, равномерность распределения и статистические характеристики могут пострадать, если применять бездарное преобразование. Одним из таких бездарных преобразований (и при этом почему то очень популярное) является операция взятия остатка.
int r = rand() % 100; // так не нужно делать!

Если нужны числа в диапазоне от 0 до 100 (не включая 100), то грамотное преобразование делается так
int r = (100.0 / (MAX_RAND + 1)) * rand();

(100.0 / (MAX_RAND + 1)) - это компилятором будет конвертировано в константу с плавающей точкой, а все преобразование будет состоять из одного умножения на эту константу.

Для примера нужен диапазон от -1000 до 1000, включая границы диапазона (всего 2001 значение)
int r = -1000 + (2001.0 / (MAX_RAND + 1)) * rand();
OI
Ozodbek Imamov
21 360
Лучший ответ
Сложи два числа. При переполнении получится отрицательное.
Руслан Айдерович при это, по-моему, равномерность распределения случайных чисел будет под большим вопросом.
Сергей Трифонов Собственно, так практически все генераторы случайных чисел и работают - берут очередное число по модулю, что эквивалентно движению по кругу.
что значит без заданного диапазона?
у вас числа в компьютерном представлении в любом случае ограничены каким то диапазоном

вычитайте и делите если нужно
Александр Макарышкин Я имел ввиду по всему типу. А не от -10 до 10.
int number = rand();
if(number%2)
number *= -1;
напишите свой генератор.

class Random
{
private:
int _seed;

public:
Random(int seed)
: _seed(seed)
{
}

int Next()
{
_seed = _seed*1664525 + 1013904223;
return _seed;
}
};
Игорь Кочетов
Игорь Кочетов
9 617
Запускать парно два генератора случайных чисел. Один - непосредственно на число, второй - в интервале 0-1 - на знак.
int y = random(2);
int x = random(num);
if(y)x*=-1;