srand (time (null)) вызывает предупреждение компилятора: неявное преобразование теряет целочисленную точность

Извиняюсь, если на этот вопрос уже дан ответ.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main () {

srand( time(NULL) );
cout << rand();
}

msgstr «неявное преобразование теряет целочисленную точность:» time_t «(он же» long «) в» unsigned int «»

Это сообщение об ошибке, которое я получаю, когда я выполняю код выше. Я использую XCode 4.6.1. Теперь, когда я использую другой компилятор, такой как тот, что на codepad.org, он прекрасно работает, генерируя то, что кажется случайными числами, поэтому я предполагаю, что это проблема xcode, которую мне нужно обойти?

Я только начал программировать, поэтому я начинающий, когда дело доходит до этого. Есть ли проблема с моим кодом или мой компилятор?

Любая помощь будет оценена!

19

Решение

msgstr «неявное преобразование теряет целочисленную точность:» time_t «(он же» long «) в» unsigned int «»

Вы теряете точность неявно, потому что time() возвращает long который больше чем unsigned int на вашей цели. Чтобы обойти эту проблему, вы должны явно привести результат (таким образом, удаляя «неявную потерю точности»):

srand( static_cast<unsigned int>(time(NULL)));

Учитывая, что сейчас 2017 год, я редактирую этот вопрос, чтобы предложить вам рассмотреть функции, предоставляемые std::chrono::* определяется в <chrono> как часть C ++ 11. Ваш любимый компилятор предоставляет C ++ 11? Если нет, то это действительно должно!

Чтобы узнать текущее время, вы должны использовать:

#include <chrono>

void f() {
const std::chrono::time_point current_time = std::chrono::system_clock::now();
}

Почему я должен беспокоиться об этом, когда time() работает?

ИМО, достаточно одной причины: ясные, явные типы. Когда вы имеете дело с большими программами среди достаточно больших команд, знание того, представляют ли передаваемые значения временные интервалы или «абсолютные» времена, и какие величины являются критическими. С std::chrono Вы можете разрабатывать интерфейсы и структуры данных, которые будут переносимыми и пропускают блюз «истек срок ожидания или миллисекунды от сейчас или ожидание было секунд».

28

Другие решения

Как уже упоминалось в «nio», чистый обходной путь — явное приведение типа.

Более глубокое объяснение:

Для srand () в качестве параметра требуется unsigned int (srand(unsigned int)) но time () возвращает длинное int (long int time()) и это не принимается srand (), поэтому, чтобы исправить это, компилятор должен просто преобразовать (преобразовать) long int в unsigned int.

НО в вашем случае компилятор предупреждает вас об этом (как полагали разработчики компилятора, вы должны знать, что это все).

Так просто

srand( (unsigned int) time(NULL) );

сделает свое дело!

(простите, если я сделал что-то не так, это мой первый ответ на stackoverflow)

14

Функция srand имеет тип unsigned int в качестве аргумента, time_t — тип long. верхние 4 байта из long удаляются, но в этом нет проблем.
srand рандомизирует алгоритм rand с 4 младшими байтами времени, поэтому вы предоставляете больше данных, чем необходимо.

если вы получили ошибку, попробуйте просто явно привести тип time_t к unsigned int:

srand( (unsigned int) time(NULL) );

Еще одна интересная вещь: если вы запустите свою программу дважды в одну и ту же секунду, вы получите одно и то же случайное число, которое иногда может быть нежелательным, потому что, если вы запустите алгоритм rand с одинаковыми данными, он сгенерирует одно и то же случайное число. последовательность. Или это может быть желательно, когда вы отлаживаете какой-то кусок кода и вам нужно снова протестировать то же поведение … тогда вы просто используете что-то вроде srand(123456)

5

Это не ошибка. Код действителен, и его значение четко определено; если компилятор отказывается компилировать его, он не соответствует определению языка. Скорее всего, это предупреждение, и он говорит вам, что автор компилятора думает, что вы, возможно, допустили ошибку. Если вы настаиваете на исключении предупреждающих сообщений, вы можете добавить актерский состав, как предлагали другие. Я не большой поклонник переписывания правильного, значимого кода, чтобы удовлетворить идею некоторых авторов о хорошем стиле; Я бы отключил предупреждение. Однако, если вы сделаете это, вы можете пропустить другие места, где конверсия теряет данные, которые вы не намеревались.

2
#include <stdlib.h>
#include <iostream>         //rand
#include <time.h>       //time

float randomizer(int VarMin, int VarMax){
srand((unsigned)time(NULL));
int range = (VarMax - VarMin);
float rnd = VarMin + float(range*(rand()/(RAND_MAX + 1.0)));
return rnd;
}
0
По вопросам рекламы [email protected]