Мне нужно сгенерировать числа в диапазоне [-100; +2000] в C++. Как я могу это сделать с рандом, если есть только положительные числа? Есть ли быстрые пути?Случайные и отрицательные числа
ответ
генерирует случайное число в диапазоне от 0 до 2100 затем вычесть 100.
Быстрый поиск Google повернул вверх decent looking article on using Rand(). Она включает в себя примеры кода для работы с определенным диапазоном в конце статьи.
Можете ли вы создать число от 0 до 10000 и вычесть 100?
Генерирует случайное число в диапазоне от 0 до 2100, и вычесть 100.
Вот код.
#include <cstdlib>
#include <ctime>
int main()
{
srand((unsigned)time(0));
int min = 999, max = -1;
for(size_t i = 0; i < 100000; ++i)
{
int val = (rand()%2101)-100;
if(val < min) min = val;
if(val > max) max = val;
}
}
В настоящее время мой синтаксис C++ немного ржавый, но вы должны написать функцию, которая принимает два параметра: size
и offset
.
Таким образом, вы генерируете числа с заданным size
как максимальное значение и затем добавляете к нему (отрицательное) смещение.
функция будет выглядеть следующим образом:
int GetRandom(int size, int offset = 0);
и будет называться в вашем случае с:
int myValue = GetRandom(2100, -100);
В C++ 0x они активизируют это, чтобы обеспечить лучшую поддержку для него с стандартная библиотека.
Вы можете использовать случайные функции C++ TR1 для генерации чисел в желаемом распределении.
std::random_device rseed;
std::mt19937 rng(rseed());
std::uniform_int<int> dist(-100,2100);
std::cout << dist(rng) << '\n';
Для тех, у кого нет TR1, boost :: random довольно близко. – MSalters
Это не даст равномерного распределения! Кроме того, поиск минимального и максимального числа 100000 таких чисел не имеет отношения к вопросу. – darklon
Также, если случайно 'val' был' -100' каждый раз, результат 'max' был бы неправильным. То же самое для минимум. –
@Cornelius, @Ben: Кому это нужно? Это просто демо. Если бы я опубликовал только «(rand()% 2101) -100', что было бы лучше, чем компилируемый, исполняемый образец? Пожалуйста. –