Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is C# Random Number Generator thread safe?

Tags:

c#

random

numbers

Is C#'s Random.Next() method thread safe?

like image 809
noone Avatar asked Jun 15 '10 22:06

noone


People also ask

What is C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is C basic language?

What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

Is C same as C+?

As we know both C and C++ are programming languages and used for application development. The main difference between both these languages is C is a procedural programming language and does not support classes and objects, while C++ is a combination of both procedural and object-oriented programming languages.


2 Answers

No, using the same instance from multiple threads can cause it to break and return all 0's. However, creating a thread-safe version (without needing nasty locks on every call to Next()) is simple. Adapted from the idea in this article:

public class ThreadSafeRandom {     private static readonly Random _global = new Random();     [ThreadStatic] private static Random _local;      public int Next()     {         if (_local == null)         {             int seed;             lock (_global)             {                 seed = _global.Next();             }             _local = new Random(seed);         }          return _local.Next();     } } 

The idea is to keep a separate static Random variable for each thread. Doing that in the obvious way fails, however, because of another issue with Random - if multiple instances are created at nearly the same time (within about 15ms), they will all return the same values! To fix this, we create a globally-static Random instance to generate the seeds used by each thread.

The above article, by the way, has code demonstrating both of these issues with Random.

like image 185
BlueRaja - Danny Pflughoeft Avatar answered Sep 29 '22 04:09

BlueRaja - Danny Pflughoeft


There's nothing special done in the Next method to achieve thread safety. However, it's an instance method. If you don't share instances of Random across different threads, you don't have to worry about state corruption within an instance. Do not use a single instance of Random across different threads without holding an exclusive lock of some sort.

Jon Skeet has a couple nice posts on this subject:

StaticRandom
Revisiting randomness

As noted by some commentators, there is another potential problem in using different instances of Random that are thread-exclusive, but are seeded identically, and therefore induce the identical sequences of pseudorandom numbers, because they may be created at the same time or within close temporal proximity of each other. One way to alleviate that issue is to use a master Random instance (which is locked by a single thread) to generate some random seeds and initialize new Random instances for every other thread to use.

like image 38
mmx Avatar answered Sep 29 '22 05:09

mmx