- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 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);
}
}
}
}
kegdan 22.08.2013 05:06 # −1
1. Перепутал переменные для считывания количества совпадений
2. Random.Next нифига не потокобезопасный. Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.
Исправил так
P.S - судя по количеству комментариев всем насрать)
bormand 22.08.2013 05:57 # 0
> Похоже он генерит число и прибавляет к минимальному значению, а при параллельном обращении он просто прерывает генерацию и возвращает минимальное значение.
Да не, походу все проще. Несколько потоков одновременно читают сид, считают по нему следующее число, и пихают новый сид. Из-за этого пачки одинаковых чисел и прут.
> Random.Next нифига не потокобезопасный
Безусловно.
kegdan 22.08.2013 06:18 # −1
Они не просто одинаковые, они всегда минимально возможные
guest 28.11.2015 02:54 # 0
kegdan 22.08.2013 06:15 # −1
Пофиксил. теперь random создается один на поток