1. C++ / Говнокод #6003

    +154

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    __int64 timestamp;
    
    	// Get nanoseconds since 1601
    	timestamp = rand() + (((__int64)rand()) << 32);
    	timestamp /= 100;

    очень вольная работа со временем...

    Запостил: kubrinsky, 16 Марта 2011

    Комментарии (20) RSS

    • >> since 1601
      чече?
      Ответить
      • это когда парламент Англии запротестовал против практики продажи короной патентов на монополии, и королева Елизавета I объявила о запрещении продажи.
        Ответить
      • на чешском пиве так написано на одном
        Ответить
        • там написано: козёл. То бишь, не пей, козелом станешь ))
          Ответить
    • мм, а мне серьезно любопытно, чем так знаменит January 1, 1601 (UTC) что от него считают время в децимиллисекундах
      Ответить
    • занимательно, что обсуждение не касается кода...
      Ответить
      • Так а в чем подразумеваемая проблема с кодом-то?

        Я, например, если надо было бы к чему-то придраться, придрался бы к сдвигу на 32: в общем случае нет гарантии, что `rand()` генерирует 32 бита. Он может генерировать и намного меньше, т.е. танцевать надо было бы от `RAND_MAX`. А в остальном способ комбинации нескольких вызовов `rand()` - вполне приемлем.

        А то, что генерируется якобы именно временной интервал... так на это приведенный код никак не завязан. Хоть временной интервал, хоть число цыплят по осени - какая в данном случае разница?
        Ответить
        • Так на 32 сдвигается уже приведенное к __int64 значение.
          И формируется итог из старших и младших 4х байтовых последовательностей.
          Ответить
          • Согласитесь, что сдвигать на 32 32-битное значение — вот это был бы говнокод.
            Ответить
            • И между прочим было такое как-то. В комментариях правда одного паскалиста :)
              В данном случае, я хотел сказать, что не важно сколько бит генерит rand(), ну будут кое-где нулики, ничего страшного в этом нет. А если уж хочется все биты в int64 сделать псевдослучайными, тогда конечно надо учесть разрядность rand().
              Ответить
              • а вот в паскале так нельзя а вот в паскале пользоваться сдвигами вместо структурных типов будет говнокодом
                Ответить
          • Разумеется, а как же еще? Именно так и задумано. Да, формируется итог из двух 32-хбитных последовательностей. Именно так из 32-хбитного генератора случайных чисел делается 64-хбитный генератор случайных чисел. Именно это и пытались реализовать.

            Относительная говнокодовость тут в использовании знакового типа и в, еще раз, завязке на 32 бита.
            Ответить

    Добавить комментарий