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

    +3

    1. 1
    2. 2
    3. 3
    4. 4
    const int size = 100000;
    const int maxVal = 1e9;
    for(int i = 0; i < n; i++)
        values[i] = rand() % (maxVal + 1);

    Код работает на вин32

    Запостил: 3_dar, 25 Октября 2015

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

    • Ой, очепятался. Там size вместо n.
      Ответить
      • А на Win64 он будет работать по другому?
        Ответить
    • Вот что rand() двухбайтный с людьми делает!
      Ответить
    • Брать ранд по модулю - это уже говно изначально, гвоздь в голову забить тому, что его придумал.
      Ответить
      • Если на равномерность распределения покласть, то почему бы и нет?
        Ответить
        • Если пофиг на равномерность, почему бы не values[i] = 42?
          Ответить
          • Спалят, что числа одинаковые. Надо так: values[i] = 42 + (i & 1);
            Ответить
            • values[i] = 42 ^ i
              Ответить
              • Можно и без зелени. На первый взгляд числа действительно будут казаться случайными (по крайней мере, 64 первых числа).
                Ответить
                • да нихуя
                  42, 43, 40, 41, 46, 47, 44, 45, 34, 35, 32, 33, 38, 39, 36, 37, 58, 59, 56, 57, 62, 63, 60, 61, 50, 51, 48, 49, 54, 55, 52, 53, 10, 11, 8, 9, 14, 15, 12, 13, 2, 3, 0, 1, 6, 7, 4, 5, 26, 27, 24, 25, 30, 31, 28, 29, 18, 19, 16, 17, 22, 23, 20, 21, 106, 107, 104, 105, 110, 111, 108, 109, 98, 99, 96, 97, 102, 103, 100, 101, 122, 123, 120, 121, 126, 127, 124, 125, 114, 115, 112, 113, 118, 119, 116, 117, 74, 75, 72, 73,
                  Ответить
                  • После 53 идёт 10 — да это же случайность!!!
                    Ответить
                    • если каждое 8 брать то еще более менее

                      42, 34, 58, 50, 10, 2, 26, 18, 106, 98, 122, 114, 74,
                      Ответить
                      • Мы на пороге великого открытия!
                        Ответить
                        • Я так взволнован! Нужно оформлять патент на новый рандомизатор!
                          Ответить
                          • values[i] = 42 ^ i*8
                            Ответить
                            • Меня немножко напрягает, что все результаты чётные. Может быть, ещё пополам разделим?

                              values[i] = (42 ^ i*8) / 2;
                              Ответить
                      • а если каждый 8 забор забирать не 8 -е число а 7. То будет вообще бомба.
                        Ответить
                        • Гашиш что ли ебошишь?
                          Ответить
                        • а если не защитить этот счётчик пропусков мьютексом, то будет не псевдослучайные числа, а истинно случайные!
                          Ответить
          • values[i] = 42?rand() % (maxVal + 1):0;
            Ответить
        • Так-то оно так, только вот область значений функции rand() — отрезок [0; RAND_MAX], а значение RAND_MAX в 32-битных компиляторах обычно равно 32767. Брать rand по модулю, больше чем 32 к, бессмысленно.
          Ответить
          • Брать ранд по любому модулю бессмысленно.
            Ответить
            • Почему?
              Ответить
              • Потому что говно получается, а не распределение.
                Ответить
            • > Брать ранд по любому модулю бессмысленно.

              Ну если есть равномерное распределение в [0, N-1], и M является делителем N, то, кмк, можно брать по модулю M.
              Ответить
              • Нет, нужно ещё чтоб корреляций не было. У ЛКГ у младших битов с этим хреновато.
                http://www.gamedev.ru/code/forum/?id=206424&page=6#m89
                Обратите внимание, что "мой" метод рулит, но на самом деле он не мой, а со стокового генератора Дельфей списан.
                Ответить
                • > Просто нехер брать старшие 16 бит по модулю 2.

                  Так это вроде о другом?
                  Ответить
                  • О том же. rand() возвращает старшие 16 бит сида, как правило.
                    Ответить
      • Юзать rand() в c++ - это уже говно изначально, гвоздь в голову забить тому, что его придумал.

        1) ЛКГ - сам по себе говно с хуёвой статистикой;
        2) нет изкоробочного интерфейса для генерации чисел в нужном диапазоне;
        3) непредсказуемое поведение в многопоточной среде (дичайшие тормоза эдак в 100 раз на gcc и отдельный сид на каждый поток в msvc).

        В крестах надо юзать Ускорение::Случайность или его брата из std и забыть про все эти модули и алгоритмы из делфей как про страшный сон... Там и генератор нормальный, и адаптеры для распределений правильно написаны.
        Ответить

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