1. Objective C / Говнокод #10334

    −97

    1. 1
    2. 2
    3. 3
    4. 4
    -(int)randomNumber
    {
        return (arc4random() % 5001) + 5000; //Generates Number from 1 to 100.
    }

    Индусы получают числа от 1 до 100 О_О

    Запостил: SwinX, 21 Мая 2012

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

    • Ну если arc4random возвращает числа от -4999 до -4900 то индусы таки правы ;)
      Ответить
    • arc4random() % 5001 - Эта запись вернёт остаток от деления большого рандомного числа на 5001 (числа от 0 до 5000). Так что увы, не правы они :)
      Ответить
      • Ну не знаю как на objective-c, но на обычном c++:
        $ cat 1.cpp
        #include <stdio.h>
        int main()
        {
            printf("%d\n", ((-4900) % 5001)+5000);
            return 0;
        }
        $ g++ 1.cpp
        $ ./a.out
        100
        Ответить
        • arc4random() возвращает положительное число всегда. А ваша запись, безусловно, корректна и пойдёт для objective-c тоже.
          Ответить
        • Добро пожаловать в мир интелоарифметики, в котором остаток от деления на положительное число бывает отрицательным!
          Ответить
          • Да, тоже всегда смущало, что остаток это не число в диапазоне [0..n-1].
            Ответить
            • А можно с этого места поподробнее? Оо
              Ответить
              • http://ru.wikipedia.org/wiki/Деление_с_остатком
                Разделить целое число на натуральное число с остатком означает представить его в виде:
                http://upload.wikimedia.org/wikipedia/ru/math/a/5/0/a50ed95db7c7317ef788ccb53e336ffd.png
                Ответить
                • Спасибо Капитан Очевидность. Я про интелоарифметику.
                  Ответить
                  • В интеллоарифметике стандартные команды деления работают не так.
                    idiv -1, 4 даёт частное 0, остаток -1
                    Ответить
                    • Ага, и из-за таких "фишек" эта интелоарифметика совершенно не юзабельна например для разбиения карты на тайлы. Нельзя тупо взять частное как номер тайла и остаток как смещение в нем. Нужно городить говнокод типа такого:
                      static int div(int a, int b) {
                          return a >= 0 ? (a/b) : ((a+1)/b - 1);
                      }
                      static int mod(int a, int b) {
                          return a >= 0 ? (a%b) : ((a+1)%b + b - 1);
                      }
                      Ответить
                      • ага, сам мучаюсь
                        Кстати в Аде можно переопределить деление для стандартных целых.
                        Ответить
                        • Хм, в пределах модуля или глобально?
                          Ответить
                          • Модуля.
                            Чтобы использовать перегруженный оператор из другого модуля, надо явно написать, что блин такой-то оператор для такого-то типа бери из такого-то модуля.
                            Ответить
                            • Хм, странно в общем то для такого языка как Ада. Даже в с++ надо пилить новый тип, чтобы использовать нестандартные операторы.

                              Имхо эта фишка снижает явность кода - т.к. приходится смотреть а не перегрузили ли в данном модуле деление.
                              Ответить
                              • Да, такая вот фишка - в С++ нету, а в Аде есть. Не только для деления, а для всех стандартных операторов.
                                Про ясность кода - сам как думаешь, это реально может принести сюрпризы?
                                Ответить
                                • В большом модуле - думаю да, принесет. Хотя это еще один аргумент против больших модулей.
                                  Ответить
                • Это определение не работает для "интелоарифметики".
                  Нетрудно заметить, что в "определении" с Википедии делят ЦЕЛОЕ число на НАТУРАЛЬНОЕ.
                  Микропроцессоры же (не только интеловские) "делят" элемент кольца вычетов по основанию 2^(2^n) на элемент кольца вычетов по основанию 2^(2^k). В этих кольцах мало того, что операция деления не определена - соотношения порядка как такового нет, т.е. нельзя сказать что какой-то элемент больше или меньше другого.
                  Ответить
                  • Остался один вопрос: нахуй такая арифметика нужна?
                    Ответить
                    • Нет, вопрос формулируется так: "Вам ехать, или шашечки?" Мне - ехать.
                      Ответить
                      • И что вы хотите сказать?
                        "Куда вы денетесь с подводной лодки"?
                        Ответить
                  • Вот было бы простое основание, можно было бы делить как угодно (кроме нуля, конечно).
                    Ответить
              • http://ru.wikipedia.org/wiki/Остаток_от_деления

                "Остатком называется неотрицательное число, которое в сумме с произведением неполного частного и делителя даёт делимое."
                Ответить
    • 0_o я тоже так делаю
      Ответить
    • Просто никто не обновляет комментарии правя код. Было от 1 до 100, стало от 5000 до 10000.
      Ответить
    • )%
      Ответить

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