Си диез / Говнокод #13632 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 kegdan, (Updated )

Комментарии (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);
    
    
            }
        }
    }
    Ответить

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

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8