1. C# / Говнокод #12486

    +113

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    private int GenerateRandom(int MaxValue)
    {
        var mas = Guid.NewGuid().ToByteArray();
        return BitConverter.ToInt32(mas, 4) % MaxValue;
    }

    ....

    Запостил: roman-kashitsyn, 28 Января 2013

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

    • Я так понимаю, четверка вносит еще один элемент "случайности".
      p.s. случайно минусанул :(
      Ответить
      • >Int32
        >4
        Int32 и 4 - никаких ассоциаций?
        Без описания ToInt32(byte[],int) - непонятно, но я бы лично вычислил хеш-код.
        Ответить
        • какие тут могут быть ассоциации?
          http://bit.ly/VhfRr6
          Ответить
          • Ну когда я вижу Int32, то мозг неявно ассоцирует это с 4 байтами.
            Ответить
      • или нет. давно виндового guid генератора не видел (кажется же гуидов было несколько типов?). из того что помню, первые несколько байт они не всегда рандомные, они отражают типа номер гуида сгенерированого на системе (стартовый номер генерится случайно при установке системы). кто-то мне говорил что это есть спец фича: гуиды сгенерированые на одной системе можно просто отсортировать что бы увидеть в каком порядке они были сгенерированы и для чего-то там еще это типа нужно.
        Ответить
        • >гуиды сгенерированые на одной системе...
          в вижуалке ничего подобного не замечено (tools-create guid)
          Ответить
        • вот сгенерил 16 штук с помощью UuidCreate
          только старшая тетрада в девятом байте одинакова
          9447ea2a-2cbf-4e89-80dd-96b345af2eb9
          13c1430e-421c-482a-b515-a9d6abfb4d91
          367bfed2-4325-434c-9ad2-cfef5e73e2ff
          f07a0df9-b86e-4af9-9080-45804ed7c2ad
          f16b4187-c1c8-48c6-8a8a-9fe825ad7867
          a9a32db2-1c73-41a1-9232-8b93cc6ce76c
          cdb5ca5b-3bad-4f2b-af1e-90b211abf016
          b927e20a-fc9f-49a6-af00-9511f5554e98
          ea56f721-be31-4cc3-a37b-f7f116b00a94
          6247fe5a-0379-4694-88c1-c56c23bc2e38
          e57089c6-3d1a-41cc-a2e0-6c66f3c3f02f
          6cd51cab-de9e-4031-9752-791f6ca86bc9
          5227821b-91f7-4f67-88eb-7289ec6767ed
          2183a5ad-3e58-454f-8951-8e800d61512c
          2f2cf309-6bc4-4fef-9095-423d4cd570a3
          04827a62-06f2-4e52-813f-2ba64bf0da4b
          Ответить
          • А вот uuidgen -t (в отличие от uuidgen -r) генерит time-based uuids, и там как раз дохрена совпадает:
            $ uuidgen -t
            190d81d6-69f7-11e2-846f-000461dfffff
            $ uuidgen -t
            195a62a8-69f7-11e2-b415-000461dfffff
            $ uuidgen -t
            1995be2a-69f7-11e2-a7bc-000461dfffff
            Ответить
    • Random.Next() не для джедаев!
      --
      Каждый раз, когда я вижу рядом "Random" и "% MaxValue" мне хочется сделать facepalm.
      Ответить
      • А в сишке rand() так и используется
        Ответить
        • Это не отменяет желания сделать фэйспалм. Знания тервера во мне негодуют .
          Ответить
          • Меньше знаешь - крепче спишь.
            Ответить
          • А что тебе не нравится? Период всё равно 2**32, а вовсе не n и вовсе не RAND_MAX, хотя бы потому, что rand() возвращает старшие биты зерна.
            Ответить
            • Допустим, что наш ранд_макс = 10
              Мы хотим значения с 0 по 3, и делаем %4
              В результате мы имеем такую таблицу:
              0123456789
              0123012301

              Шанс получить 0 и 1 - 3/10
              Шанс получить 2 и 3 - 2/10
              Конечно, ранд_макс на несколько порядков выше, и эффект мал, но не всегда пренебрежимо мал.
              Всё зависит от отношения rand_max/max
              Ответить
              • А так же и от делимости rand_max на max..
                Ответить
              • Ну тогда да, но тогда и рандомайзеры, возвращающие 2**32 значений, тоже говно.
                А вообще сишный ранд говно потому, что деление с остатком на n - это тормоза.
                В Паскале же сделано оптимальнее, ведь берётся seed*n/(2**32), что делается одним умножением и взятием edx.
                Ответить
                • ещё сишный ранд хранит спрятанное глобальное состояние, что есть полное говно
                  Ответить
            • Обрезая биты мы не изменяем распределение.
              Ответить
              • Это смотря какое оно изначально было.
                Ответить
                • Вообще-то, оно должно быть равномерным, или это уже нифига не псевдорандом. А почему он равномерного при максимальном значении, кратном степени двойки, можно отрезать биты - я доказать могу, хотя и не хочу :)
                  Ответить
                  • *он равномерного = от равномерного
                    Ответить
                  • Да в общем очевидно и так, ведь младшие ж биты отбрасываем, старшие оставляем.
                    Ответить
        • Скажем так, с искажениями вероятностей, вносимых этим методом я готов мириться только в микроконтроллерах )
          Ответить
          • так ведь про закон распределения тут никто не говорил.
            Ответить
            • Ну лично я считаю искажения закона распределения - говнокодом, пусть для кого-то и не очевидным.
              Ответить
    • ну и каково получившееся распределение?
      Ответить

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