Я подозреваю, что вы используете один и тот же экземпляр Random
одновременно в нескольких потоках. Не делайте этого - это не потокобезопасно.
Параметры:
Random
для каждого потока (здесь может помочь ThreadStatic
) Random
, но используйте его только в замке. У меня есть сообщение в блоге с примерами кода, но, пожалуйста, прочтите комментарии, а также есть хорошие предложения по его улучшению. Я планирую написать еще одну статью о случайности в какой-то момент в ближайшем будущем ...
Я не верю, что класс Random разработан для потокобезопасности (одновременного использования из нескольких потоков) - поэтому если вы используете один экземпляр таким образом, вы можете повредить состояние генератора случайных чисел, не позволяя ему работать правильно.
Вы можете оформить статическую переменную, содержащую ссылку на класс Random, как ThreadStatic
, что позволит вам поддерживать отдельный экземпляр для каждого потока:
[ThreadStatic]
private static Random m_Random; // don't attempt to initialize this here...
public void YourThreadStartMethod()
{
// initialize each random instance as each thread starts...
m_Random = new Random();
}
Если вы используете .NET 4.0, существует также класс ThreadLocal
который упрощает инициализацию одного экземпляра для каждого потока.
Я думаю, вам следует вместо этого использовать RNGCryptoServiceProvider
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx
Объект Random
не является потокобезопасным. Чтобы обойти это, вы можете использовать этот код, украденный из этого ответа :
class ThreadSafeRandom
{
private static Random random = new Random();
public static int Next()
{
lock (random)
{
return random.Next();
}
}
}
Вы также можете использовать RNGCryptoServiceProvider
, который является потокобезопасным, а также генерирует более качественные случайные данные.