2016-05-07 2 views
-2

Я хотел заполнить массив случайными числами (я использую cuRand), но какой сюрприз, когда я заметил, что, хотя я кажусь случайным, каждый раз, когда я запускаю код (я говоря о разных исполнениях), там они, всегда одинаковые числа (не столь случайные). Я продолжал проверять свое семя, и я получал всегда то же значение, которое было 1462615827. Я попытался сделать его неподписанным и получить то же самое значение. Что может произойти в этом идиллическом коде?время (NULL) возвращает allways одинаковое значение

unsigned long seed1 = unsigned(time(NULL)); 
printf("%lu\n", seed1); 
//The same number is printed every execution 

EDIT: Самое странное, что случилось. Я сохранил работу на своем сетевом диске и перезапустил свой компьютер. Это не сработает (я думаю, что материнская плата потерпела крах). Я просто продолжал работать на другом ПК, и семя было прекрасно воспринято. Итак, может это быть аппаратный сбой?

+4

В коде, который вы указали, имеет смысл, что ваши семена одинаковы. 'time' на типичных системах меняется только каждую секунду, и получение текущего времени не займет секунды. Но ваш текст вопроса подсказывает, что вы даже получили то же время после изменения кода, повторной компиляции и повторного запуска. Это было бы очень необычно. Если это действительно так, вы можете отредактировать свой вопрос, чтобы сосредоточиться на этом? – hvd

+0

Я бы проверил значение 'errno'. –

+0

IMO это не подлежит повторению – granmirupa

ответ

3

time() не возвращает случайное число. Он возвращает текущее время календаря. Как правило, значение представляет секунды с эпохи (которая обычно составляет 00:00 часов, 1 января 1970 UTC).

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

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

Это время примерно 4 минуты, прежде чем отвечал на этот вопрос. Я полагаю, что вы на самом деле не пытались выполнить свою программу, за исключением той секунды.

Если вы это сделали, то это, вероятно, ОС или проблема с оборудованием.

+0

«Я продолжал проверять свое семя, и я получил все то же значение, что и 1462615827», поэтому он сознателен – granmirupa

+0

Нет ничего обязательного, чтобы 'time_t' должен был быть подписан или без знака, только чтобы он был целым числом тип. Что * * означает, что если 'time()' не увенчалось успехом, он возвращает '(time_t) -1'. В любом случае выход OP делает это ясно, что это не имеет никакого отношения к unsigned/signed/overflow. –

+0

@ user6292850 Вы правы в 'time_t', хотя я не понимаю. OP/задается вопросом, почему их семя было одинаковым, даже если они преобразуют целое число без знака в подписанное. Единственный случай, когда этого не происходит, - это то, что значение unsigned не может быть представлено подписным типом. – user2079303

Смежные вопросы