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

    +135

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    using System;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication32
    {
        class Program
        {
            static readonly Random Random = new Random(DateTime.Now.Millisecond);
            private static int _counterTrue = 0;
            private static int _counterFalse = 0;
            private const int _MaxRand = int.MaxValue;
            private const int testLimit = 10000000;
    
            static void Main(string[] args)
            {
                Parallel.For(0, testLimit, (i) => Test());
                Console.WriteLine(_counterTrue);
                Console.WriteLine(_counterFalse);
                Console.WriteLine(_counterFalse/(float)(testLimit));
                Console.ReadKey();
    
            }
            static private void Test()
            {
                var first = Random.Next(_MaxRand);
                var second = Random.Next(_MaxRand);
                if (first == second)
                {
                    second = Random.Next(_MaxRand);
                }
                if (first == second)
                {
                    Interlocked.Increment(ref  _counterTrue);
                }
                else
                {
                    Interlocked.Increment(ref  _counterFalse);
                }
            }
        }
    }

    http://govnokod.ru/13631

    Собственно программа проверки

    vistefan 11 минут назад # 0
    С таким кодом вам тред новый надо было создавать.

    Создал, поливаем меня самодельным шоколадом

    Запостил: kegdan, 21 Августа 2013

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

    • Сам убедился, что говнокод
      1. Перепутал переменные для считывания количества совпадений
      2. Random.Next нифига не потокобезопасный. Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.

      Исправил так
      using System;
      using System.Threading;
      using System.Threading.Tasks;
      
      namespace ConsoleApplication32
      {
          class Program
          {
              private static int _counterFalse = 0;
              private const int _MaxRand = int.MaxValue;
              private const int testLimit = 1000000;
      
              static void Main(string[] args)
              {
                  Parallel.For(0, testLimit, Test);
                  Console.WriteLine(_counterFalse/(float) (testLimit));
                  Console.ReadKey();
              }
      
              static private void Test(int i)
              {
                  var random = new Random(i.GetHashCode());
                  var first = random.Next(1, _MaxRand);
                  var second = random.Next(1, _MaxRand);
                  if (first != second) return;
                  second = random.Next(1, _MaxRand);
                  if (first == second) Interlocked.Increment(ref _counterFalse);
      
      
              }
          }
      }


      P.S - судя по количеству комментариев всем насрать)
      Ответить
      • Каждый раз новый рендом создавать тоже совсем не айс. Получается, что тестируешь не рандом а хеш-функцию ;)

        > Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.
        Да не, походу все проще. Несколько потоков одновременно читают сид, считают по нему следующее число, и пихают новый сид. Из-за этого пачки одинаковых чисел и прут.

        > Random.Next нифига не потокобезопасный
        Безусловно.
        Ответить
        • >Из-за этого пачки одинаковых чисел и прут

          Они не просто одинаковые, они всегда минимально возможные
          Ответить
      • Всем насрать на тебя просто
        Ответить
    • >Каждый раз новый рендом создавать тоже совсем не айс
      Пофиксил. теперь random создается один на поток
      using System;
      using System.Threading;
      using System.Threading.Tasks;
      
      namespace ConsoleApplication32
      {
          class Program
          {
              private static int _counterFalse = 0;
              private const int _MaxRand = int.MaxValue;
              private const int testLimit = 100000000;
      
              static void Main(string[] args)
              {
                  Parallel.For(0, testLimit, () => new Random(Thread.CurrentThread.ManagedThreadId), 
                                             (j, pls, random) =>{Test(random); return random;}, 
                                             (random) => {});
                  Console.WriteLine(_counterFalse/(float) (testLimit));
                  Console.ReadKey();
              }
      
              static private void Test(Random random)
              {
               
                  var first = random.Next(_MaxRand);
                  var second = random.Next(_MaxRand);
                  if (first != second) return;
                  second = random.Next(_MaxRand);
                  if (first == second) Interlocked.Increment(ref _counterFalse);
      
      
              }
          }
      }
      Ответить

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