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

    +24

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    int randomize(int Min, int Max)
    {
    qsrand(QTime::currentTime().msec());
    if (Min > Max)
    {
    int Temp = Min;
    Min = Max;
    Max = Temp;
    }
    return ((qrand()%(Max-Min+1))+Min);
    }

    Всё хорошо?

    Запостил: Hackeridze, 29 Мая 2013

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

    • if (Min > Max)
      {
      int Temp = Min;
      Min = Max;
      Max = Temp;
      }


      Ыыы
      Ответить
    • 1) Делать srand перед каждой генерацией числа - моветон. Если в одну миллисекунду пройдет несколько генераций - все вернут одинаковый ответ.
      2) Обмен min и max - защита от дурака, который не осилил доку к функции?
      3) Какой нахер randomize? Это ж генерация рандомной точки на отрезке... Если хочется назвать это рандомайзом - убирайте строки 4-10.

      В остальном сойдет.
      Ответить
      • ошибка: в названии randomize не найдена буква Q
        Ответить
      • Обмен Min и Max вообще не нужен. Формула будет работать, даже если они перепутаны. Если, конечно, еретические отрицательные числа не запрещены.
        Ответить
        • P.S. Всё-таки обмен нужен. Разные компиляторы по-разному считают остаток от деления на отрицательное.
          Ответить
    • Такое использование рандомайзера это сишкоблядство.
      В стиле Турбопаса это было бы так:

      int(((long long)(qrand()) * (long long)(max-min+1))>>32)
      (вменяемый компилятор это превратит в одно умножение и возврат edx)
      а остатки по модулю они для многих генераторов зацикливаются
      и ещё умножать быстрее чем делить
      Ответить
      • предположим, что [min, max) это [10, 20)
        предположим, что qrand() вернул 30
        твоя формула вернет значение в пределах [10, 20) ?
        Ответить
        • То, что к выражению следует дописать "+min", я оставил читателю в качестве упражнения.
          Я обсуждаю именно способ масштибирования числа, равномерно распределённого по очень большому отрезку, на число, равномерно распределённое по короткому отрезку.
          Ответить
          • 1.0*(max-min+1)*rand()/RAND_MAX+min
            Ответить
            • Фу, сопроцессор.
              Ответить
              • Ты можешь с rand написать лучше?
                Ответить
                • (((uint64_t)(max-min+1))*rand()) / RAND_MAX + min
                  Ответить
                  • фу, медленное деление div
                    Ответить
                    • Ну как уж генератор замутили. Если бы RAND_MAX не был кривым и произвольным - деление было бы ненужным.

                      P.S. Да и у тебя оно тоже есть ;)
                      Ответить
                      • Ну у меня то fdiv, а не div.

                        > Если бы RAND_MAX
                        Мечтать не вредно. В qt что-то другое придумали? Если и придумали, то явно в сторону ухудшения генератора и гибкости от версии к версии.
                        Ответить
      • >int(((long long)(qrand()) * (long long)(max-min+1))>>32)
        >(вменяемый компилятор это превратит в одно умножение и возврат edx)
        Какой вообще смысл в "высокоуровневой" сишке, если на асме оно и короче и понятней?
        Ответить

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