Потеря точности - предупреждение при использовании srand

Я пытаюсь использовать srand вместе со временем для рандомизированного значения. Если я смотрю на функцию srand, она принимает unsigned int, но если мы инициализируем ее временем, которое, кажется, имеет длинное длинное значение, поэтому компилятор продолжает жаловаться на предупреждение о потере точности. Есть ли лучший способ сделать что-то?

// srand definition
void srand (unsigned int seed);
// using srand with time to seed random value
srand(time(NULL));

предупреждение 712: (Информация -- Потеря точности (аргумент № 1) (long long to unsigned int))


person oneday    schedule 29.07.2015    source источник
comment
Простая душа: приведите к unsigned int.   -  person too honest for this site    schedule 30.07.2015
comment
@Olaf: Да, это, вероятно, заглушит предупреждение, но ИМХО это раздражающий обходной путь, поскольку приведение просто указывает то же преобразование, которое в любом случае произошло бы. Это также может привести к ошибке, если вы ошибетесь с типом.   -  person Keith Thompson    schedule 30.07.2015
comment
поэтому из всех ответов кажется, что предложение состоит в том, чтобы просто привести его к типу или игнорировать предупреждение компилятора -   -  person oneday    schedule 30.07.2015
comment
Какой компилятор вы используете?   -  person Keith Thompson    schedule 30.07.2015
comment
Я попробовал это как на VC++, так и на gcc/Linux - получил одинаковое предупреждение в обоих местах.   -  person oneday    schedule 30.07.2015
comment
Приведение - это не обходной путь, но способ C сообщить компилятору, что вы знаете, что делаете, и заткнуться для этого конкретного приведения. Вот почему вы никогда не должны использовать приведения типов только потому, что вам кажется, что они выглядят причудливо или **другой язык, такой как C++, требует этого - как для malloc, например.   -  person too honest for this site    schedule 30.07.2015
comment
Кстати: C или C++! Это разные языки. Выбери один!   -  person too honest for this site    schedule 30.07.2015


Ответы (2)


Если вы используете C++, загляните в <random>. У него гораздо лучшие PRNG.

Если вы ограничены rand, вы можете в этом случае проигнорировать предупреждение или, что еще лучше, сообщить компилятору, что вам все равно, явно приведя (unsigned)time(NULL).

person rici    schedule 29.07.2015
comment
Я думаю, это ответ, который я получаю от всех - я продолжу и реализую его таким образом .. спасибо Ричи - person oneday; 30.07.2015

Говоря простой логикой, вполне логично, что вы теряете точность, когда используете long long вместо unsigned int, и что компилятор предупреждает вас об этом. (long long может представлять больший диапазон чисел, вы можете проверить здесь разница).

Если вы считаете, что, несмотря на потерю, ваши потребности удовлетворены, вы можете либо преобразовать его в unsigned int, либо просто проигнорировать предупреждение.

person Nick Louloudakis    schedule 29.07.2015