Spelling
This commit is contained in:
parent
a8121a306e
commit
817895015f
@ -36,13 +36,12 @@ public sealed class MultiChannelRng<TNum> : IRandom<TNum>, IDisposable where TNu
|
|||||||
#region Constructors
|
#region Constructors
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a multi-threaded random number generator.
|
/// Creates a multithreaded random number generator.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// This constructor uses the user's current local time
|
/// This constructor uses the user's current local time
|
||||||
/// to derive necessary parameters for the generator.
|
/// to derive the necessary parameters for the generator.
|
||||||
/// Thus, the results are depending on the time, where
|
/// Thus, the results depend on the time when the generator was created.
|
||||||
/// the generator was created.
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public MultiChannelRng()
|
public MultiChannelRng()
|
||||||
{
|
{
|
||||||
@ -58,7 +57,7 @@ public sealed class MultiChannelRng<TNum> : IRandom<TNum>, IDisposable where TNu
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a multi-threaded random number generator.
|
/// Creates a multithreaded random number generator.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// A multi-threaded random number generator created by this constructor is
|
/// A multi-threaded random number generator created by this constructor is
|
||||||
|
@ -12,18 +12,15 @@ namespace FastRng;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// Please note, that Math.NET's (https://www.mathdotnet.com/) random number generator is in some situations faster.
|
/// Please note, that Math.NET's (https://www.mathdotnet.com/) random number generator is in some situations faster.
|
||||||
/// Unlike Math.NET, MultiThreadedRng is multi-threaded. Consumers can use a token to cancel e.g. timeout an operation.<br/><br/>
|
/// Unlike Math.NET, MultiThreadedRng is multithreaded. Consumers can use a token to cancel an operation.<br/><br/>
|
||||||
///
|
///
|
||||||
/// MultiThreadedRng using a shape fitter (a rejection sampler) to enforce arbitrary shapes of probabilities for
|
/// MultiThreadedRng using a shape fitter (a rejection sampler) to enforce arbitrary shapes of probabilities for
|
||||||
/// desired distributions. By using the shape fitter, it is even easy to define discontinuous, arbitrary functions
|
/// desired distributions. By using the shape fitter, it is even easier to define discontinuous, arbitrary functions
|
||||||
/// as shapes. Any consumer can define and use own distributions.<br/><br/>
|
/// as shapes. Any consumer can define and use own distributions.<br/><br/>
|
||||||
///
|
///
|
||||||
/// This class uses the George Marsaglia's MWC algorithm. The algorithm's implementation based loosely on John D.
|
/// This class uses the George Marsaglia's MWC algorithm. The algorithm's implementation is based loosely on John D.
|
||||||
/// Cook's (johndcook.com) implementation (https://www.codeproject.com/Articles/25172/Simple-Random-Number-Generation).
|
/// Cook's (johndcook.com) implementation (https://www.codeproject.com/Articles/25172/Simple-Random-Number-Generation).
|
||||||
/// Thanks John for the inspiration.<br/><br/>
|
/// Thanks, John, for the inspiration.<br/><br/>
|
||||||
///
|
|
||||||
/// Please notice: When using the debug environment, MultiThreadedRng might uses a smaller buffer size. Please ensure,
|
|
||||||
/// that the production environment uses a release build, though.
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TNum : IFloatingPointIeee754<TNum>, IAdditionOperators<TNum, TNum, TNum>
|
public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TNum : IFloatingPointIeee754<TNum>, IAdditionOperators<TNum, TNum, TNum>
|
||||||
{
|
{
|
||||||
@ -33,10 +30,10 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
private const int BUFFER_SIZE = 1_000_000;
|
private const int BUFFER_SIZE = 1_000_000;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// The queue size means, how many buffer we store in a queue at the same time:
|
// The queue size means, how many buffers we store in a queue at the same time:
|
||||||
private const int QUEUE_SIZE_FLOAT = 2;
|
private const int QUEUE_SIZE_FLOAT = 2;
|
||||||
|
|
||||||
// The queue size means, how many buffer we store in a queue at the same time:
|
// The queue size means, how many buffers we store in a queue at the same time:
|
||||||
private const int QUEUE_SIZE_INT = QUEUE_SIZE_FLOAT * 2;
|
private const int QUEUE_SIZE_INT = QUEUE_SIZE_FLOAT * 2;
|
||||||
|
|
||||||
private static readonly TNum CONST_FLOAT_CONVERSION = TNum.CreateChecked(2.328306435454494e-10f);
|
private static readonly TNum CONST_FLOAT_CONVERSION = TNum.CreateChecked(2.328306435454494e-10f);
|
||||||
@ -65,7 +62,7 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
private uint mW;
|
private uint mW;
|
||||||
private uint mZ;
|
private uint mZ;
|
||||||
|
|
||||||
// This is the current buffer for the consumer side i.e. the public interfaces:
|
// This is the current buffer for the consumer side, i.e., the public interfaces:
|
||||||
private TNum[] currentBuffer = [];
|
private TNum[] currentBuffer = [];
|
||||||
|
|
||||||
// The current pointer to the next current buffer's address to read from:
|
// The current pointer to the next current buffer's address to read from:
|
||||||
@ -77,10 +74,8 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
/// Creates a multi-threaded random number generator.
|
/// Creates a multi-threaded random number generator.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <remarks>
|
/// <remarks>
|
||||||
/// This constructor uses the user's current local time
|
/// This constructor uses the user's current local time to derive the necessary parameters for the generator.
|
||||||
/// to derive necessary parameters for the generator.
|
/// Thus, the results depend on the time when the generator was created.
|
||||||
/// Thus, the results are depending on the time, where
|
|
||||||
/// the generator was created.
|
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public MultiThreadedRng()
|
public MultiThreadedRng()
|
||||||
{
|
{
|
||||||
@ -171,7 +166,7 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Ensure, that we do not produce more buffers, as configured:
|
// Ensure that we do not produce more buffers, as configured:
|
||||||
if (this.queueIntegers.Count < QUEUE_SIZE_INT)
|
if (this.queueIntegers.Count < QUEUE_SIZE_INT)
|
||||||
{
|
{
|
||||||
this.queueIntegers.Enqueue(nextBuffer);
|
this.queueIntegers.Enqueue(nextBuffer);
|
||||||
@ -224,7 +219,7 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Ensure, that the queue contains only the configured number of buffers:
|
// Ensure that the queue contains only the configured number of buffers:
|
||||||
if (this.queueFloats.Count < QUEUE_SIZE_FLOAT)
|
if (this.queueFloats.Count < QUEUE_SIZE_FLOAT)
|
||||||
{
|
{
|
||||||
this.queueFloats.Enqueue(nextBuffer);
|
this.queueFloats.Enqueue(nextBuffer);
|
||||||
@ -273,7 +268,7 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
// can get the next buffer:
|
// can get the next buffer:
|
||||||
lock (LOCKER)
|
lock (LOCKER)
|
||||||
{
|
{
|
||||||
// We are might not the first thread, which has to get the next buffer.
|
// We might not the first thread, which has to get the next buffer.
|
||||||
// When some other thread has already got the next buffer, the pointer
|
// When some other thread has already got the next buffer, the pointer
|
||||||
// was already reset to zero. In this case, we start over again:
|
// was already reset to zero. In this case, we start over again:
|
||||||
if(this.currentBufferPointer < BUFFER_SIZE)
|
if(this.currentBufferPointer < BUFFER_SIZE)
|
||||||
@ -295,7 +290,7 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
|
|||||||
// Made a local copy of the current pointer:
|
// Made a local copy of the current pointer:
|
||||||
var myPointer = this.currentBufferPointer;
|
var myPointer = this.currentBufferPointer;
|
||||||
|
|
||||||
// Issue #8: This might happens when the current thread was interrupted by another thread, and
|
// Issue #8: This might happen when another thread interrupted the current thread, and
|
||||||
// the other thread has already updated the pointer. In this case, we start over again.
|
// the other thread has already updated the pointer. In this case, we start over again.
|
||||||
if (myPointer >= BUFFER_SIZE)
|
if (myPointer >= BUFFER_SIZE)
|
||||||
goto Start;
|
goto Start;
|
||||||
|
Loading…
Reference in New Issue
Block a user