C++ Что содержится в младших 32 битах: Заполнение mt

У меня есть строка кода, которая использует наносекундный захват высокоточных часов для заполнения генератора псевдослучайных чисел Mersenne Twister. Что-то в этом роде:

rng.seed(duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch().count());

Я знаю, что mt в boost может принимать только 32-битные целые числа (это то, что принимает seed()) и что эта продолжительность, приведенная к наносекундам, составляет не менее 64 бит (я также знаю, что этот код вызовет предупреждение о преобразовании, которое может быть позаботился с помощью static_cast).

Мой вопрос заключается в том, когда это преобразование в 32-битное целое число будет содержимым этих битов. Я знаю, что компилятор сохраняет младшие 32 бита при преобразовании 64-битного целого числа в 32-битное целое число. Я также нахожусь на машине с маленьким порядком байтов. Поскольку я знаю, что текущее время эпохи в секундах составляет ~ 1,4 * 10 ^ 9, будут ли эти младшие 32 бита первыми ~ 10 цифрами времени эпохи или, поскольку это прямой порядок байтов, это будет случайная тарабарщина в конце?

Любые советы или указания на чтение очень ценятся.


person joshu    schedule 24.06.2015    source источник
comment
почему вы не печатаете результат приведения?   -  person m.s.    schedule 24.06.2015
comment
Возможно, вам следует использовать 64. -битная версия генератора, mt19937_64 вместо этого?   -  person Some programmer dude    schedule 24.06.2015
comment
64-битная версия намного медленнее и требовательнее к ресурсам, верно?   -  person joshu    schedule 24.06.2015


Ответы (2)


Endianness не имеет к этому никакого отношения. «Младшие» 32 бита 64-битного значения — это биты 0-31, то есть биты со значениями от 1‹‹0 до 1‹‹31. IOW, принимая младшие 32 бита, просто принимает значение по модулю 1‹‹32.

И да, для часов это означает быстро меняющуюся часть.

person MSalters    schedule 24.06.2015
comment
Не могли бы вы указать мне на какую-нибудь литературу по этому поводу? Я не совсем понимаю это, и как вы узнаете, что быстро движущаяся часть - это младшие биты? - person joshu; 24.06.2015
comment
@joshu: На самом деле это базовая двоичная арифметика. Каждую наносекунду часы увеличиваются на 000000000000000000000000000000000000000000000000000001. Очевидно, что 1 находится справа, и мы начинаем считать справа. - person MSalters; 24.06.2015
comment
Разве младшие 32 бита не слева? Я имею в виду, что я понимаю, что биты слева меньшие с точки зрения времени, но разве у них нет более высоких адресов с точки зрения памяти, что означает, что они являются старшими 32? - person joshu; 25.06.2015
comment
@joshu: порядок байтов действительно связан с порядком, но это байты в памяти. Математика всегда одна и та же, независимо от порядка следования байтов, и подсчет битов в переменной всегда идет справа. - person MSalters; 26.06.2015

Для безопасного «понижения» просто используйте деление по модулю:

int64_t nanoseconds = duration_cast<nanoseconds>(high_resolution_clock::now().time_since_epoch().count()
int32_t seed = nanoseconds % std::numeric_limits<int32_t>::max();
rng.seed(seed);
person DarkWanderer    schedule 24.06.2015