diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,19 @@
 
+Version 5.2
+-----
+
+* Significantly improved in the examples the speed of simulation after using
+  the mwc-random package by Bryan O'Sullivan for generating random numbers.
+  It was possible to use custom random number generators before, but now
+  the mentioned generator is used by default. Also the type signature of
+  the SimpleGeneratorWithSeed data constructor has changed.
+
+Version 5.1.1
+-----
+
+* Updated the pure-functional priority queue so that the events could be yielded
+  in the distributed simulation module too.
+
 Version 5.1
 -----
 
diff --git a/Simulation/Aivika/Dynamics/Random.hs b/Simulation/Aivika/Dynamics/Random.hs
--- a/Simulation/Aivika/Dynamics/Random.hs
+++ b/Simulation/Aivika/Dynamics/Random.hs
@@ -34,8 +34,6 @@
         memoRandomWeibullDynamics,
         memoRandomDiscreteDynamics) where
 
-import System.Random
-
 import Control.Monad.Trans
 
 import Simulation.Aivika.Generator
diff --git a/Simulation/Aivika/Generator.hs b/Simulation/Aivika/Generator.hs
--- a/Simulation/Aivika/Generator.hs
+++ b/Simulation/Aivika/Generator.hs
@@ -20,7 +20,10 @@
         newRandomGenerator01) where
 
 import System.Random
+import qualified System.Random.MWC as MWC
 import Data.IORef
+import Data.Word
+import Data.Vector
 
 -- | A discrete probability density function.
 type DiscretePDF a = [(a, Double)]
@@ -99,9 +102,15 @@
                         -> IO Int
 generateUniformInt01 g min max =
   do x <- g
-     let min' = fromIntegral min
-         max' = fromIntegral max
-     return $ round (min' + x * (max' - min'))
+     let min' = fromIntegral min - 0.5
+         max' = fromIntegral max + 0.5
+         z    = round (min' + x * (max' - min'))
+         z'   = if z < min
+                then min
+                else if z > max
+                     then max
+                     else z
+     return z'
 
 -- | Generate the triangular random number by the specified minimum, median and maximum.
 generateTriangular01 :: IO Double
@@ -295,7 +304,7 @@
 -- | Defines a type of the random number generator.
 data GeneratorType = SimpleGenerator
                      -- ^ The simple random number generator.
-                   | SimpleGeneratorWithSeed Int
+                   | SimpleGeneratorWithSeed Word32
                      -- ^ The simple random number generator with the specified seed.
                    | CustomGenerator (IO Generator)
                      -- ^ The custom random number generator.
@@ -308,9 +317,9 @@
 newGenerator tp =
   case tp of
     SimpleGenerator ->
-      newStdGen >>= newRandomGenerator
+      MWC.uniform <$> MWC.withSystemRandom (return :: MWC.GenIO -> IO MWC.GenIO) >>= newRandomGenerator01
     SimpleGeneratorWithSeed x ->
-      newRandomGenerator $ mkStdGen x
+      MWC.uniform <$> MWC.initialize (singleton x) >>= newRandomGenerator01
     CustomGenerator g ->
       g
     CustomGenerator01 g ->
diff --git a/Simulation/Aivika/Parameter/Random.hs b/Simulation/Aivika/Parameter/Random.hs
--- a/Simulation/Aivika/Parameter/Random.hs
+++ b/Simulation/Aivika/Parameter/Random.hs
@@ -36,8 +36,6 @@
         randomTrue,
         randomFalse) where
 
-import System.Random
-
 import Control.Monad.Trans
 
 import Simulation.Aivika.Generator
diff --git a/Simulation/Aivika/PriorityQueue/Pure.hs b/Simulation/Aivika/PriorityQueue/Pure.hs
--- a/Simulation/Aivika/PriorityQueue/Pure.hs
+++ b/Simulation/Aivika/PriorityQueue/Pure.hs
@@ -43,7 +43,7 @@
 
 -- | Enqueue a new element with the specified priority.
 enqueue :: PriorityQueue a -> Double -> a -> PriorityQueue a
-enqueue pq k v = mergeQueues (Queue 1 k v 1 EmptyQueue EmptyQueue) pq
+enqueue pq k v = mergeQueues pq (Queue 1 k v 1 EmptyQueue EmptyQueue)
 
 -- | Dequeue the element with the minimal priority.
 dequeue :: PriorityQueue a -> PriorityQueue a
diff --git a/Simulation/Aivika/QueueStrategy.hs b/Simulation/Aivika/QueueStrategy.hs
--- a/Simulation/Aivika/QueueStrategy.hs
+++ b/Simulation/Aivika/QueueStrategy.hs
@@ -13,10 +13,11 @@
 --
 module Simulation.Aivika.QueueStrategy where
 
-import System.Random
 import Control.Monad.Trans
 import Data.Maybe
 
+import Simulation.Aivika.Parameter
+import Simulation.Aivika.Parameter.Random
 import Simulation.Aivika.Simulation
 import Simulation.Aivika.Event
 import Simulation.Aivika.DoubleLinkedList
@@ -236,11 +237,10 @@
 instance DequeueStrategy SIRO where
 
   strategyDequeue (SIROQueue q) =
-    liftIO $
-    do n <- V.vectorCount q
-       i <- getStdRandom (randomR (0, n - 1))
-       x <- V.readVector q i
-       V.vectorDeleteAt q i
+    do n <- liftIO $ V.vectorCount q
+       i <- liftParameter $ randomUniformInt 0 (n - 1)
+       x <- liftIO $ V.readVector q i
+       liftIO $ V.vectorDeleteAt q i
        return x
 
 -- | An implementation of the 'SIRO' queue strategy.
diff --git a/aivika.cabal b/aivika.cabal
--- a/aivika.cabal
+++ b/aivika.cabal
@@ -1,5 +1,5 @@
 name:            aivika
-version:         5.1
+version:         5.2
 synopsis:        A multi-method simulation library
 description:
     Aivika is a discrete event simulation (DES) framework with support of activity-oriented,
@@ -232,6 +232,7 @@
                      array >= 0.3.0.0,
                      containers >= 0.4.0.0,
                      random >= 1.0.0.3,
+                     mwc-random >= 0.13.0.0,
                      vector >= 0.10.0.1,
                      deepseq >= 1.1.0.0,
                      binary >= 0.6.4.0
