Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
Сам убедился, что говнокод
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 нифига не потокобезопасный
Безусловно.
1. Перепутал переменные для считывания количества совпадений
2. Random.Next нифига не потокобезопасный. Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.
Исправил так
P.S - судя по количеству комментариев всем насрать)
> Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.
Да не, походу все проще. Несколько потоков одновременно читают сид, считают по нему следующее число, и пихают новый сид. Из-за этого пачки одинаковых чисел и прут.
> Random.Next нифига не потокобезопасный
Безусловно.
Они не просто одинаковые, они всегда минимально возможные
Пофиксил. теперь random создается один на поток