Другие языки программирования и технологии
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();
все генераторы выдают некое количество (множество) значений, и эти значения попадают в некий интервал.
стандартный генератор 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();
Сложи два числа. При переполнении получится отрицательное.
Руслан Айдерович
при это, по-моему, равномерность распределения случайных чисел будет под большим вопросом.
Сергей Трифонов
Собственно, так практически все генераторы случайных чисел и работают - берут очередное число по модулю, что эквивалентно движению по кругу.
что значит без заданного диапазона?
у вас числа в компьютерном представлении в любом случае ограничены каким то диапазоном
вычитайте и делите если нужно
у вас числа в компьютерном представлении в любом случае ограничены каким то диапазоном
вычитайте и делите если нужно
Александр Макарышкин
Я имел ввиду по всему типу. А не от -10 до 10.
int number = rand();
if(number%2)
number *= -1;
if(number%2)
number *= -1;
напишите свой генератор.
class Random
{
private:
int _seed;
public:
Random(int seed)
: _seed(seed)
{
}
int Next()
{
_seed = _seed*1664525 + 1013904223;
return _seed;
}
};
class Random
{
private:
int _seed;
public:
Random(int seed)
: _seed(seed)
{
}
int Next()
{
_seed = _seed*1664525 + 1013904223;
return _seed;
}
};
Запускать парно два генератора случайных чисел. Один - непосредственно на число, второй - в интервале 0-1 - на знак.
int y = random(2);
int x = random(num);
if(y)x*=-1;
int y = random(2);
int x = random(num);
if(y)x*=-1;
Похожие вопросы
- Генератор Случайных Чисел
- 1.Заполнить массив случайными числами. Вывести элементы массива на экран. Заменить все его минимальные элементы нулями.
- MASM32 случайные числа, , массив
- Генератор случайных чисел в Basic или C++
- Генератор случайных чисел на VS C++
- c++, как отрандомить случайное число типа float в диапазоне от 0 до 10 ? (пример - 0,42; 7,71)
- Есть ли программа способная подогнать случайные числа под нужную сумму
- Помогите!! C ++ Вводится число от 1...999. Вывести данное число на естественном языке. Например, 52 – пятьдесят два.
- Заполните случайными числами в
- Делфи, вывод в мемо случайных чисел без повторов из массива. массив от 1 до 35.