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

    +110

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    public static int getRandomNumber(int from, int to)
    {
           System.Threading.Thread.Sleep(10);
           Random r = new Random();
           int var = r.Next(from, to);
           return var;
    }

    No comments

    Запостил: bazhenovc, 20 Августа 2012

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

    • Счастливо поймать InterruptException.
      Ответить
    • создаем видимость трудной работы?
      Ответить
      • Нет. Здесь каждый раз переинициализируется класс, и если вызывать этот код в цикле - можно запросто словить 5-10 одинаковых значений.
        Но программист настолько суров, что вместо того, чтобы вынести класс за пределы фунции, ждёт пока сменится рандом сид, зависящий от таймера

        В общем это труЪговнокод.
        Ответить
        • > переинициализируется класс, и если вызывать этот код в цикле - можно запросто словить 5-10 одинаковых значений
          ну здесь же нет стартового сида, поэтому трудно сказать, будут последовательности одинаковы, или нет
          Ответить
          • По дефолту, при создании Random - старовый seed равен - Environment.TickCount. И поэтому при быстром создании Random обьектов, seed может совпадать. Автор не понял причины проблемы, и сделал фикс через одно место.
            Ответить
            • Причём, как я понимаю, если не знать причины, то такой фикс можно сделать только наугад?
              Ответить
              • Причину можно легко узнать из MSDN-а http://msdn.microsoft.com/ru-ru/library/h343ddh9.aspx
                Либо с помощью Reflector и подобных посмотреть исходный код.

                Имхо, чтобы использовать рандомную генерацию, нужно хотя бы знать, что она зависит от начального seed, а не просто тупо скопипастить сэмпл из гугла. Что автор скорее всего и сделал.
                Ответить
                • public static void Main()
                  {
                     Random rand1 = new Random();
                     Random rand2 = new Random();
                     Thread.Sleep(2000);
                     Random rand3 = new Random();
                     ShowRandomNumbers(rand1);
                     ShowRandomNumbers(rand2);
                     ShowRandomNumbers(rand3);
                  }


                  Так вот откуда ноги растут!
                  Ответить
        • А я было подумал, что это заглушка для тестирования какая-нибудь, причем пока недописанная.
          Ответить
    • По объекту на каждый вызов. Стресс-тест GC.
      Ответить
      • Ну это кстати нормально.
        А Random в шарпах thread-safe?
        Ответить
        • Конкретно с потокобезопасностью тут всё в порядке, потому как для каждого вызова создастся свой объект.
          Ответить
          • А. Вот граждане меня минусуют. Но я не вижу обоснованной критики.

            >Конкретно с потокобезопасностью тут всё в порядке
            Спасибо кеп, мой вопрос о другом.
            Ответить
            • Политика .net по потокобезопасности гласит:
              Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.
              Ответить
      • >По объекту на каждый вызов.
        первый признак конструктора
        Ответить
    • В конце поста автор этого кода опубликовал коммент - "Спасибо за критику, спасибо пользователю general, он спустил меня на землю. Исправлю функции, жестоко протестирую и опубликую топик вновь.".
      Теперь нужно подождать нового топика чтобы понять, извлек ли он из этого что-то полезное.
      Ответить
      • coll3ctor карма: -11,0
        Думаю - уже не дождёмся
        Ответить

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