Случайный C#. Затем внезапно остановки возвращая случайные значения [дубликат]

7
задан Community 23 May 2017 в 12:08
поделиться

4 ответа

Я подозреваю, что вы используете один и тот же экземпляр Random одновременно в нескольких потоках. Не делайте этого - это не потокобезопасно.

Параметры:

  • Создать новый экземпляр Random для каждого потока (здесь может помочь ThreadStatic )
  • Используйте единственный экземпляр Random , но используйте его только в замке.

У меня есть сообщение в блоге с примерами кода, но, пожалуйста, прочтите комментарии, а также есть хорошие предложения по его улучшению. Я планирую написать еще одну статью о случайности в какой-то момент в ближайшем будущем ...

21
ответ дан 6 December 2019 в 06:02
поделиться

Я не верю, что класс 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 который упрощает инициализацию одного экземпляра для каждого потока.

6
ответ дан 6 December 2019 в 06:02
поделиться

Я думаю, вам следует вместо этого использовать RNGCryptoServiceProvider

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx

1
ответ дан 6 December 2019 в 06:02
поделиться

Объект Random не является потокобезопасным. Чтобы обойти это, вы можете использовать этот код, украденный из этого ответа :

class ThreadSafeRandom 
{ 
    private static Random random = new Random(); 

    public static int Next() 
    { 
       lock (random) 
       { 
           return random.Next(); 
       } 
    } 
}

Вы также можете использовать RNGCryptoServiceProvider , который является потокобезопасным, а также генерирует более качественные случайные данные.

2
ответ дан 6 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: