2014-01-13 2 views
0

Я хочу создать случайное число между указанным диапазоном, но когда я запустил следующий код. он дает ошибку, может ли кто-нибудь объяснить ошибку, пожалуйста?проблемы с генерированием 32-битных случайных чисел

#include <iostream> 
#include <random> 
using namespace std; 
unsigned long int starting=2347483648; 
unsigned long int ending=3994967296; 
unsigned int rand(unsigned long int first,unsigned long int last) 
{ 
    std::random_device rd; 
    std::mt19937 eng(rd()); 
    std::uniform_int_distribution<> distr(first, last); 
    return (unsigned int)distr(eng) << ' '; 
} 
int main() 
{ 
    cout<<rand(1,ending);//generate random number in this range 
} 

Программа брейки и выдает ошибку

недействителен мин и макс аргументы для uniform_int

Объясните причину ошибки и сказать мне, как я могу генерировать случайные числа между выше указанного диапазона

+0

Если я не ошибаюсь, аргумент шаблона по умолчанию для 'uniform_int_distribution' - это int. И unsigned long int не может вписаться в int. –

+0

ну, если вызывается вышеупомянутая функция с этими значениями rand (начало, окончание), она отлично работает ... – Ahmed

+1

Я должен сказать, тон вопроса не так хорош. – fleetC0m

ответ

3

Попробуйте следующее:

std::uniform_int_distribution<unsigned long int> distr(first, last); 
    return (unsigned int)distr(eng); 
} 

Я также удалил ошибочный << ' ', который смещается влево с символом пробела, а не добавляет пробел к выходу.

int main() 
{ 
    cout<<rand(1,ending) << " "; 
} 

Когда ending (или последнего) преобразуется в Int, он становится -300000000. ending также становится max() для ограничение, поэтому ending == distr.max(). Используя std::numeric_limits<int>::min(), мы можем видеть, что полученное значение может вписываться в int.

+0

Да, это работает, но вы можете объяснить, почему приведенный выше код дает ошибку, если первый аргумент равен 1 и выполняется, если он «начинает», – Ahmed