Increased performance by factor two by removing all async parts

Closes #2
This commit is contained in:
Thorsten Sommer 2023-07-10 16:38:25 +02:00
parent 1c28a57c06
commit d0eca012ce
No known key found for this signature in database
GPG Key ID: B0B7E2FC074BF1F5
30 changed files with 509 additions and 532 deletions

View File

@ -19,46 +19,46 @@ public abstract class Distribution<TNum> : IDistribution<TNum> where TNum : IFlo
private protected abstract TNum ShapeFunction(TNum x); private protected abstract TNum ShapeFunction(TNum x);
public async ValueTask<TNum> GetDistributedValue(CancellationToken token = default) => await this.fitter.NextNumber(token); public TNum GetDistributedValue(CancellationToken token = default) => this.fitter.NextNumber(token);
public async ValueTask<uint> NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default) public uint NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (uint) ((float.CreateChecked(distributedValue) * range) + rangeStart); return (uint) ((float.CreateChecked(distributedValue) * range) + rangeStart);
} }
public async ValueTask<ulong> NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default) public ulong NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (ulong) ((double.CreateChecked(distributedValue) * range) + rangeStart); return (ulong) ((double.CreateChecked(distributedValue) * range) + rangeStart);
} }
public async ValueTask<TNum> NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default) public TNum NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (distributedValue * range) + rangeStart; return (distributedValue * range) + rangeStart;
} }
public async ValueTask<TNum> NextNumber(CancellationToken cancel = default) => await this.NextNumber(TNum.Zero, TNum.One, cancel); public TNum NextNumber(CancellationToken cancel = default) => this.NextNumber(TNum.Zero, TNum.One, cancel);
public async ValueTask<bool> HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default) public bool HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default)
{ {
var number = await this.NextNumber(cancel); var number = this.NextNumber(cancel);
return number > above && number < below; return number > above && number < below;
} }
} }

View File

@ -6,15 +6,15 @@ namespace FastRng.Distributions;
public interface IDistribution<TNum> where TNum : IFloatingPointIeee754<TNum> public interface IDistribution<TNum> where TNum : IFloatingPointIeee754<TNum>
{ {
public ValueTask<TNum> GetDistributedValue(CancellationToken token); public TNum GetDistributedValue(CancellationToken token = default);
public ValueTask<uint> NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default); public uint NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default);
public ValueTask<ulong> NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default); public ulong NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default);
public ValueTask<TNum> NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default); public TNum NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default);
public ValueTask<TNum> NextNumber(CancellationToken cancel = default); public TNum NextNumber(CancellationToken cancel = default);
public ValueTask<bool> HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default); public bool HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default);
} }

View File

@ -14,46 +14,46 @@ public sealed class Uniform<TNum> : IDistribution<TNum> where TNum : IFloatingPo
this.rng = rng ?? throw new ArgumentNullException(nameof(rng), "An IRandom<TNum> implementation is needed."); this.rng = rng ?? throw new ArgumentNullException(nameof(rng), "An IRandom<TNum> implementation is needed.");
} }
public async ValueTask<TNum> GetDistributedValue(CancellationToken token = default) => await this.rng.GetUniform(token); public TNum GetDistributedValue(CancellationToken token = default) => this.rng.GetUniform(token);
public async ValueTask<uint> NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default) public uint NextNumber(uint rangeStart, uint rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (uint) ((float.CreateChecked(distributedValue) * range) + rangeStart); return (uint) ((float.CreateChecked(distributedValue) * range) + rangeStart);
} }
public async ValueTask<ulong> NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default) public ulong NextNumber(ulong rangeStart, ulong rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (ulong) ((double.CreateChecked(distributedValue) * range) + rangeStart); return (ulong) ((double.CreateChecked(distributedValue) * range) + rangeStart);
} }
public async ValueTask<TNum> NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default) public TNum NextNumber(TNum rangeStart, TNum rangeEnd, CancellationToken cancel = default)
{ {
// Swap the values if the range start is greater than the range end: // Swap the values if the range start is greater than the range end:
if (rangeStart > rangeEnd) if (rangeStart > rangeEnd)
(rangeStart, rangeEnd) = (rangeEnd, rangeStart); (rangeStart, rangeEnd) = (rangeEnd, rangeStart);
var range = rangeEnd - rangeStart; var range = rangeEnd - rangeStart;
var distributedValue = await this.GetDistributedValue(cancel); var distributedValue = this.GetDistributedValue(cancel);
return (distributedValue * range) + rangeStart; return (distributedValue * range) + rangeStart;
} }
public async ValueTask<TNum> NextNumber(CancellationToken cancel = default) => await this.NextNumber(TNum.Zero, TNum.One, cancel); public TNum NextNumber(CancellationToken cancel = default) => this.NextNumber(TNum.Zero, TNum.One, cancel);
public async ValueTask<bool> HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default) public bool HasDecisionBeenMade(TNum above, TNum below, CancellationToken cancel = default)
{ {
var number = await this.NextNumber(cancel); var number = this.NextNumber(cancel);
return number > above && number < below; return number > above && number < below;
} }
} }

View File

@ -18,6 +18,5 @@ public interface IRandom<TNum> : IDisposable where TNum : IFloatingPointIeee754<
/// This method is thread-safe. You can consume numbers from the same generator /// This method is thread-safe. You can consume numbers from the same generator
/// by using multiple threads at the same time. /// by using multiple threads at the same time.
/// </remarks> /// </remarks>
/// <param name="cancel">An optional cancellation token.</param> public TNum GetUniform(CancellationToken cancel = default);
public ValueTask<TNum> GetUniform(CancellationToken cancel = default);
} }

View File

@ -29,15 +29,19 @@ namespace FastRng;
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>
{ {
#if DEBUG #if DEBUG
private const int BUFFER_SIZE = 10_000; private const int BUFFER_SIZE = 1_000_000;
#else #else
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 buffer we store in a queue at the same time:
private const int QUEUE_SIZE = 2; private const int QUEUE_SIZE_FLOAT = 2;
// The queue size means, how many buffer we store in a queue at the same time:
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);
private static readonly object LOCKER = new();
// Gets used to stop the producer threads: // Gets used to stop the producer threads:
private readonly CancellationTokenSource producerTokenSource = new(); private readonly CancellationTokenSource producerTokenSource = new();
@ -169,7 +173,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) if (this.queueIntegers.Count < QUEUE_SIZE_INT)
{ {
this.queueIntegers.Enqueue(nextBuffer); this.queueIntegers.Enqueue(nextBuffer);
break; break;
@ -222,7 +226,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) if (this.queueFloats.Count < QUEUE_SIZE_FLOAT)
{ {
this.queueFloats.Enqueue(nextBuffer); this.queueFloats.Enqueue(nextBuffer);
break; break;
@ -255,67 +259,37 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
/// This method is thread-safe. You can consume numbers from the same generator /// This method is thread-safe. You can consume numbers from the same generator
/// by using multiple threads at the same time. /// by using multiple threads at the same time.
/// </remarks> /// </remarks>
/// <param name="cancel">An optional cancellation token.</param> public TNum GetUniform(CancellationToken cancel = default)
public async ValueTask<TNum> GetUniform(CancellationToken cancel = default)
{ {
while (!cancel.IsCancellationRequested) if (cancel.IsCancellationRequested)
{ return TNum.NaN;
// Check, if we need a new buffer to read from:
Start:
// Check if we have to load the next buffer:
if (this.currentBufferPointer >= BUFFER_SIZE) if (this.currentBufferPointer >= BUFFER_SIZE)
{ {
// Create a local copy of the current buffer's pointer: // We have to get the next buffer from the queue. This is a critical
var currentBufferReference = this.currentBuffer; // section, because we have to ensure, that only one thread at a time
// can get the next buffer:
lock (LOCKER)
{
// We are might not the first thread, which has to get the next buffer.
// When some other thread has already got the next buffer, the pointer
// was already reset to zero. In this case, we start over again:
if(this.currentBufferPointer < BUFFER_SIZE)
goto Start;
// Here, we store the next buffer until we implement it: while (!this.queueFloats.TryDequeue(out this.currentBuffer))
var nextBuffer = Array.Empty<TNum>();
// Try to get the next buffer from the queue:
while (this.currentBufferPointer >= BUFFER_SIZE && currentBufferReference == this.currentBuffer && !this.queueFloats.TryDequeue(out nextBuffer))
{ {
// if (cancel.IsCancellationRequested)
// Case: There is no next buffer available.
// Must wait for producer(s) to provide next.
//
try
{
await Task.Delay(this.waiter, cancel);
}
catch (TaskCanceledException)
{
//
// Case: The consumer cancelled the request.
//
return TNum.NaN; return TNum.NaN;
}
Thread.Sleep(TimeSpan.FromMilliseconds(6));
} }
// // Reset the pointer for the next thread or call:
// Note: In general, it does not matter if the following compare-exchange is successful.
// 1st case: It was successful -- everything is fine. But we are responsible to re-set the currentBufferPointer.
// 2nd case: It was not successful. This means, that another thread was successful, though.
// That case is fine as well. But we would loose one buffer of work. Thus, we
// check for this case and preserve the buffer full of work.
//
// Try to implement the dequeued buffer without locking other threads:
if (Interlocked.CompareExchange(ref this.currentBuffer, nextBuffer, currentBufferReference) != currentBufferReference)
{
//
// Case: Another thread updated the buffer already.
// Thus, we enqueue our copy of the next buffer to preserve it.
//
this.queueFloats.Enqueue(nextBuffer);
// Next? We can go ahead and yield a random number...
}
else
{
//
// Case: We updated the buffer.
//
this.currentBufferPointer = 0; this.currentBufferPointer = 0;
// Next? We can go ahead and yield a random number...
} }
} }
@ -326,26 +300,15 @@ public sealed class MultiThreadedRng<TNum> : IRandom<TNum>, IDisposable where TN
var nextPointer = myPointer + 1; var nextPointer = myPointer + 1;
// Try to update the pointer without locking other threads: // Try to update the pointer without locking other threads:
if (Interlocked.CompareExchange(ref this.currentBufferPointer, nextPointer, myPointer) == myPointer) if (Interlocked.CompareExchange(ref this.currentBufferPointer, nextPointer, myPointer) != myPointer)
{ goto Start;
// //
// Case: Success. We updated the pointer and, thus, can use the pointer to read a number. // Case: Success. We updated the pointer and, thus, can use the read number.
// //
return this.currentBuffer[myPointer]; return this.currentBuffer[myPointer];
} }
//
// Case: Another thread updated the pointer already. Must restart the process
// to get a random number.
//
}
//
// Case: The consumer cancelled the request.
//
return TNum.NaN;
}
private void StopProducer() => this.producerTokenSource.Cancel(); private void StopProducer() => this.producerTokenSource.Cancel();
/// <summary> /// <summary>

View File

@ -50,11 +50,11 @@ public sealed class ShapeFitter<TNum> where TNum : IFloatingPointIeee754<TNum>,
/// </summary> /// </summary>
/// <param name="token">An optional cancellation token.</param> /// <param name="token">An optional cancellation token.</param>
/// <returns>The next value regarding the given shape.</returns> /// <returns>The next value regarding the given shape.</returns>
public async ValueTask<TNum> NextNumber(CancellationToken token = default) public TNum NextNumber(CancellationToken token = default)
{ {
while (!token.IsCancellationRequested) while (!token.IsCancellationRequested)
{ {
var x = await this.rng.GetUniform(token); var x = this.rng.GetUniform(token);
if (TNum.IsNaN(x)) if (TNum.IsNaN(x))
return x; return x;
@ -63,7 +63,7 @@ public sealed class ShapeFitter<TNum> where TNum : IFloatingPointIeee754<TNum>,
nextBucket = this.probabilities.Length - 1; nextBucket = this.probabilities.Length - 1;
var threshold = this.probabilities[nextBucket]; var threshold = this.probabilities[nextBucket];
var y = await this.uniform.NextNumber(TNum.Zero, this.max, token); var y = this.uniform.NextNumber(TNum.Zero, this.max, token);
if (TNum.IsNaN(y)) if (TNum.IsNaN(y))
return y; return y;

View File

@ -3,7 +3,6 @@ using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using FastRng; using FastRng;
using FastRng.Distributions; using FastRng.Distributions;
using FastRngTests.Distributions;
using NUnit.Framework; using NUnit.Framework;
namespace FastRngTests; namespace FastRngTests;
@ -23,9 +22,9 @@ public class DecisionTester
var neededCoinTossesB = 0; var neededCoinTossesB = 0;
var neededCoinTossesC = 0; var neededCoinTossesC = 0;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.0f, 0.1f)) neededCoinTossesA++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.0f, 0.1f)) neededCoinTossesA++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++;
var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC}; var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC};
var max = values.Max(); var max = values.Max();
@ -47,9 +46,9 @@ public class DecisionTester
var neededCoinTossesB = 0; var neededCoinTossesB = 0;
var neededCoinTossesC = 0; var neededCoinTossesC = 0;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.0f, 0.1f)) neededCoinTossesA++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.0f, 0.1f)) neededCoinTossesA++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++; for(var n = 0; n < 100; n++) while (!dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++;
var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC}; var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC};
var max = values.Max(); var max = values.Max();

View File

@ -13,14 +13,14 @@ public class BetaA2B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaDistribution01() public void TestBetaDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.BetaA2B2<float>(rng); var dist = new FastRng.Distributions.BetaA2B2<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class BetaA2B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange01() public void TestBetaGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA2B2<float>(rng); var dist = new FastRng.Distributions.BetaA2B2<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class BetaA2B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange02() public void TestBetaGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA2B2<float>(rng); var dist = new FastRng.Distributions.BetaA2B2<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class BetaA2B5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaDistribution01() public void TestBetaDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.BetaA2B5<float>(rng); var dist = new FastRng.Distributions.BetaA2B5<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class BetaA2B5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange01() public void TestBetaGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA2B5<float>(rng); var dist = new FastRng.Distributions.BetaA2B5<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class BetaA2B5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange02() public void TestBetaGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA2B5<float>(rng); var dist = new FastRng.Distributions.BetaA2B5<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class BetaA5B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaDistribution01() public void TestBetaDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.BetaA5B2<float>(rng); var dist = new FastRng.Distributions.BetaA5B2<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class BetaA5B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange01() public void TestBetaGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA5B2<float>(rng); var dist = new FastRng.Distributions.BetaA5B2<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class BetaA5B2
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestBetaGeneratorWithRange02() public void TestBetaGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.BetaA5B2<float>(rng); var dist = new FastRng.Distributions.BetaA5B2<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class CauchyLorentzX0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyDistribution01() public void TestCauchyDistribution01()
{ {
// The properties of the cauchy distribution cannot be tested by mean, media or variance, // The properties of the cauchy distribution cannot be tested by mean, media or variance,
// cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments // cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments
@ -23,7 +23,7 @@ public class CauchyLorentzX0
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -49,13 +49,13 @@ public class CauchyLorentzX0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyGeneratorWithRange01() public void TestCauchyGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng); var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -64,13 +64,13 @@ public class CauchyLorentzX0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyGeneratorWithRange02() public void TestCauchyGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng); var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class CauchyLorentzX1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyDistribution01() public void TestCauchyDistribution01()
{ {
// The properties of the cauchy distribution cannot be tested by mean, media or variance, // The properties of the cauchy distribution cannot be tested by mean, media or variance,
// cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments // cf. https://en.wikipedia.org/wiki/Cauchy_distribution#Explanation_of_undefined_moments
@ -23,7 +23,7 @@ public class CauchyLorentzX1
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -49,13 +49,13 @@ public class CauchyLorentzX1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyGeneratorWithRange01() public void TestCauchyGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng); var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -64,13 +64,13 @@ public class CauchyLorentzX1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCauchyGeneratorWithRange02() public void TestCauchyGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng); var dist = new FastRng.Distributions.CauchyLorentzX0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class ChiSquareK1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareDistribution01() public void TestChiSquareDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK1<float>(rng); var dist = new FastRng.Distributions.ChiSquareK1<float>(rng);
@ -21,7 +21,7 @@ public class ChiSquareK1
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
{ {
var value = await dist.NextNumber(); var value = dist.NextNumber();
fqa.CountThis(value); fqa.CountThis(value);
} }
@ -49,13 +49,13 @@ public class ChiSquareK1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange01() public void TestChiSquareGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK1<float>(rng); var dist = new FastRng.Distributions.ChiSquareK1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -64,13 +64,13 @@ public class ChiSquareK1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange02() public void TestChiSquareGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK1<float>(rng); var dist = new FastRng.Distributions.ChiSquareK1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class ChiSquareK10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareDistribution01() public void TestChiSquareDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK10<float>(rng); var dist = new FastRng.Distributions.ChiSquareK10<float>(rng);
@ -21,7 +21,7 @@ public class ChiSquareK10
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
{ {
var value = await dist.NextNumber(); var value = dist.NextNumber();
fqa.CountThis(value); fqa.CountThis(value);
} }
@ -49,13 +49,13 @@ public class ChiSquareK10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange01() public void TestChiSquareGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK10<float>(rng); var dist = new FastRng.Distributions.ChiSquareK10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -64,13 +64,13 @@ public class ChiSquareK10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange02() public void TestChiSquareGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK10<float>(rng); var dist = new FastRng.Distributions.ChiSquareK10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class ChiSquareK4
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareDistribution01() public void TestChiSquareDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK4<float>(rng); var dist = new FastRng.Distributions.ChiSquareK4<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class ChiSquareK4
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange01() public void TestChiSquareGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK4<float>(rng); var dist = new FastRng.Distributions.ChiSquareK4<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class ChiSquareK4
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestChiSquareGeneratorWithRange02() public void TestChiSquareGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ChiSquareK4<float>(rng); var dist = new FastRng.Distributions.ChiSquareK4<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class ExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialDistribution01() public void TestExponentialDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa10<float>(rng); var dist = new FastRng.Distributions.ExponentialLa10<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class ExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange01() public void TestExponentialGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa10<float>(rng); var dist = new FastRng.Distributions.ExponentialLa10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class ExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange02() public void TestExponentialGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa10<float>(rng); var dist = new FastRng.Distributions.ExponentialLa10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class ExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialDistribution01() public void TestExponentialDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa5<float>(rng); var dist = new FastRng.Distributions.ExponentialLa5<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class ExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange01() public void TestExponentialGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa5<float>(rng); var dist = new FastRng.Distributions.ExponentialLa5<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class ExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange02() public void TestExponentialGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.ExponentialLa5<float>(rng); var dist = new FastRng.Distributions.ExponentialLa5<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class GammaA5B15
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestGammaDistribution01() public void TestGammaDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.GammaA5B15<float>(rng); var dist = new FastRng.Distributions.GammaA5B15<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class GammaA5B15
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestGammaGeneratorWithRange01() public void TestGammaGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.GammaA5B15<float>(rng); var dist = new FastRng.Distributions.GammaA5B15<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -61,13 +61,13 @@ public class GammaA5B15
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestGammaGeneratorWithRange02() public void TestGammaGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.GammaA5B15<float>(rng); var dist = new FastRng.Distributions.GammaA5B15<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class InverseExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialDistribution01() public void TestExponentialDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class InverseExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange01() public void TestExponentialGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class InverseExponentialLa10
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange02() public void TestExponentialGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa10<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class InverseExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialDistribution01() public void TestExponentialDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng);
var fqa = new FrequencyAnalysis(); var fqa = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fqa.CountThis(await dist.NextNumber()); fqa.CountThis(dist.NextNumber());
var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class InverseExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange01() public void TestExponentialGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class InverseExponentialLa5
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestExponentialGeneratorWithRange02() public void TestExponentialGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng); var dist = new FastRng.Distributions.InverseExponentialLa5<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class InverseGammaA3B05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestInverseGammaDistribution01() public void TestInverseGammaDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng); var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class InverseGammaA3B05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestInverseGammaGeneratorWithRange01() public void TestInverseGammaGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng); var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class InverseGammaA3B05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestInverseGammaGeneratorWithRange02() public void TestInverseGammaGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng); var dist = new FastRng.Distributions.InverseGammaA3B05<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class LaplaceB01M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceDistribution01() public void TestLaplaceDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class LaplaceB01M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceGeneratorWithRange01() public void TestLaplaceGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class LaplaceB01M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceGeneratorWithRange02() public void TestLaplaceGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class LaplaceB01M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceDistribution01() public void TestLaplaceDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class LaplaceB01M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceGeneratorWithRange01() public void TestLaplaceGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class LaplaceB01M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLaplaceGeneratorWithRange02() public void TestLaplaceGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng); var dist = new FastRng.Distributions.LaplaceB01M05<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class LogNormalS1M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLogNormalDistribution01() public void TestLogNormalDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng); var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class LogNormalS1M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLogNormalGeneratorWithRange01() public void TestLogNormalGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng); var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class LogNormalS1M0
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestLogNormalGeneratorWithRange02() public void TestLogNormalGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng); var dist = new FastRng.Distributions.LogNormalS1M0<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class NormalS02M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestNormalDistribution01() public void TestNormalDistribution01()
{ {
const float MEAN = 0.5f; const float MEAN = 0.5f;
const float STANDARD_DEVIATION = 0.2f; const float STANDARD_DEVIATION = 0.2f;
@ -25,7 +25,7 @@ public class NormalS02M05
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
{ {
var nextNumber = await dist.NextNumber(); var nextNumber = dist.NextNumber();
stats.Push(nextNumber); stats.Push(nextNumber);
fra.CountThis(nextNumber); fra.CountThis(nextNumber);
} }
@ -42,13 +42,13 @@ public class NormalS02M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestNormalGeneratorWithRange01() public void TestNormalGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.NormalS02M05<float>(rng); var dist = new FastRng.Distributions.NormalS02M05<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -57,13 +57,13 @@ public class NormalS02M05
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestNormalGeneratorWithRange02() public void TestNormalGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.NormalS02M05<float>(rng); var dist = new FastRng.Distributions.NormalS02M05<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,14 +13,14 @@ public class StudentTNu1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestStudentTDistribution01() public void TestStudentTDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.StudentTNu1<float>(rng); var dist = new FastRng.Distributions.StudentTNu1<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class StudentTNu1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestStudentTGeneratorWithRange01() public void TestStudentTGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.StudentTNu1<float>(rng); var dist = new FastRng.Distributions.StudentTNu1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class StudentTNu1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestStudentTGeneratorWithRange02() public void TestStudentTGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.StudentTNu1<float>(rng); var dist = new FastRng.Distributions.StudentTNu1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -13,7 +13,7 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestUniformDistribution01() public void TestUniformDistribution01()
{ {
const float A = 0.0f; const float A = 0.0f;
const float B = 1.0f; const float B = 1.0f;
@ -26,7 +26,7 @@ public class Uniform
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
{ {
var value = await rng.GetUniform(); var value = rng.GetUniform();
stats.Push(value); stats.Push(value);
fra.CountThis(value); fra.CountThis(value);
} }
@ -62,7 +62,7 @@ public class Uniform
int n; int n;
for (n = 0; n != NUM_ROUNDS; ++n) for (n = 0; n != NUM_ROUNDS; ++n)
samples[n] = await rng.GetUniform(); samples[n] = rng.GetUniform();
Array.Sort(samples); Array.Sort(samples);
@ -113,13 +113,13 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestUniformGeneratorWithRange01() public void TestUniformGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -128,13 +128,13 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestUniformGeneratorWithRange02() public void TestUniformGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -143,12 +143,12 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestUniformGeneratorWithRange04() public void TestUniformGeneratorWithRange04()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await rng.GetUniform(); samples[n] = rng.GetUniform();
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");
@ -157,14 +157,14 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange05Uint() public void TestRange05Uint()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0, 100)]++; distribution[dist.NextNumber(0, 100)]++;
for (var n = 0; n < distribution.Length - 1; n++) for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0)); Assert.That(distribution[n], Is.GreaterThan(0));
@ -173,14 +173,14 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange05Ulong() public void TestRange05Ulong()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0UL, 100)]++; distribution[dist.NextNumber(0UL, 100)]++;
for (var n = 0; n < distribution.Length - 1; n++) for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0)); Assert.That(distribution[n], Is.GreaterThan(0));
@ -189,14 +189,14 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange05Float() public void TestRange05Float()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await dist.NextNumber(0.0f, 100.0f))]++; distribution[(uint)MathF.Floor(dist.NextNumber(0.0f, 100.0f))]++;
for (var n = 0; n < distribution.Length - 1; n++) for (var n = 0; n < distribution.Length - 1; n++)
Assert.That(distribution[n], Is.GreaterThan(0)); Assert.That(distribution[n], Is.GreaterThan(0));
@ -204,84 +204,84 @@ public class Uniform
[Test] [Test]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDistribution001Uint() public void TestDistribution001Uint()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0, 100)]++; distribution[dist.NextNumber(0, 100)]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
} }
[Test] [Test]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDistribution001Ulong() public void TestDistribution001Ulong()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0UL, 100)]++; distribution[dist.NextNumber(0UL, 100)]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
} }
[Test] [Test]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDistribution001Float() public void TestDistribution001Float()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 1_000_000; var runs = 1_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await dist.NextNumber(0.0f, 100.0f))]++; distribution[(uint)MathF.Floor(dist.NextNumber(0.0f, 100.0f))]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 600));
} }
[Test] [Test]
[Category(TestCategories.LONG_RUNNING)] [Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Uint() public void TestDistribution002Uint()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 100_000_000; var runs = 100_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0, 100)]++; distribution[dist.NextNumber(0, 100)]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
} }
[Test] [Test]
[Category(TestCategories.LONG_RUNNING)] [Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Ulong() public void TestDistribution002Ulong()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 100_000_000; var runs = 100_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[await dist.NextNumber(0UL, 100)]++; distribution[dist.NextNumber(0UL, 100)]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
} }
[Test] [Test]
[Category(TestCategories.LONG_RUNNING)] [Category(TestCategories.LONG_RUNNING)]
public async Task TestDistribution002Float() public void TestDistribution002Float()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.Uniform<float>(rng); var dist = new FastRng.Distributions.Uniform<float>(rng);
var distribution = new uint[101]; var distribution = new uint[101];
var runs = 100_000_000; var runs = 100_000_000;
for (var n = 0; n < runs; n++) for (var n = 0; n < runs; n++)
distribution[(uint)MathF.Floor(await dist.NextNumber(0.0f, 100.0f))]++; distribution[(uint)MathF.Floor(dist.NextNumber(0.0f, 100.0f))]++;
Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000)); Assert.That(distribution[..^1].Max() - distribution[..^1].Min(), Is.InRange(0, 6_000));
} }

View File

@ -13,14 +13,14 @@ public class WeibullK05La1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestWeibullDistribution01() public void TestWeibullDistribution01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.WeibullK05La1<float>(rng); var dist = new FastRng.Distributions.WeibullK05La1<float>(rng);
var fra = new FrequencyAnalysis(); var fra = new FrequencyAnalysis();
for (var n = 0; n < 100_000; n++) for (var n = 0; n < 100_000; n++)
fra.CountThis(await dist.NextNumber()); fra.CountThis(dist.NextNumber());
var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine); var result = fra.NormalizeAndPlotEvents(TestContext.WriteLine);
@ -46,13 +46,13 @@ public class WeibullK05La1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestWeibullGeneratorWithRange01() public void TestWeibullGeneratorWithRange01()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.WeibullK05La1<float>(rng); var dist = new FastRng.Distributions.WeibullK05La1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(-1.0f, 1.0f); samples[n] = dist.NextNumber(-1.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(-1.0f), "Min out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max out of range");
@ -61,13 +61,13 @@ public class WeibullK05La1
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestWeibullGeneratorWithRange02() public void TestWeibullGeneratorWithRange02()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var dist = new FastRng.Distributions.WeibullK05La1<float>(rng); var dist = new FastRng.Distributions.WeibullK05La1<float>(rng);
var samples = new float[1_000]; var samples = new float[1_000];
for (var n = 0; n < samples.Length; n++) for (var n = 0; n < samples.Length; n++)
samples[n] = await dist.NextNumber(0.0f, 1.0f); samples[n] = dist.NextNumber(0.0f, 1.0f);
Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range"); Assert.That(samples.Min(), Is.GreaterThanOrEqualTo(0.0f), "Min is out of range");
Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range"); Assert.That(samples.Max(), Is.LessThanOrEqualTo(1.0f), "Max is out of range");

View File

@ -1,10 +1,8 @@
using System; using System;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
using FastRng; using FastRng;
using FastRng.Distributions; using FastRng.Distributions;
using FastRngTests.Distributions;
using NUnit.Framework; using NUnit.Framework;
namespace FastRngTests; namespace FastRngTests;
@ -17,147 +15,147 @@ public class MultiThreadedRngTests
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange01Uint() public void TestRange01Uint()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
for (uint n = 0; n < 1_000_000; n++) for (uint n = 0; n < 1_000_000; n++)
Assert.That(await dist.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n)); Assert.That(dist.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange01Ulong() public void TestRange01Ulong()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
for (ulong n = 0; n < 1_000_000; n++) for (ulong n = 0; n < 1_000_000; n++)
Assert.That(await dist.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n)); Assert.That(dist.NextNumber (n, 100_000 + n), Is.InRange(n, 100_000 + n));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange01Float() public void TestRange01Float()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
for (var n = 0.0f; n < 1e6f; n++) for (var n = 0.0f; n < 1e6f; n++)
Assert.That(await dist.NextNumber(n, 100_000 + n), Is.InRange(n, 100_000 + n)); Assert.That(dist.NextNumber (n, 100_000 + n), Is.InRange(n, 100_000 + n));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange02Uint() public void TestRange02Uint()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5, 5), Is.EqualTo(5)); Assert.That(dist.NextNumber (5, 5), Is.EqualTo(5));
Assert.That(await dist.NextNumber(0, 0), Is.EqualTo(0)); Assert.That(dist.NextNumber (0, 0), Is.EqualTo(0));
Assert.That(await dist.NextNumber(3_000_000_000, 3_000_000_000), Is.EqualTo(3_000_000_000)); Assert.That(dist.NextNumber (3_000_000_000, 3_000_000_000), Is.EqualTo(3_000_000_000));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange02Ulong() public void TestRange02Ulong()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5UL, 5), Is.EqualTo(5)); Assert.That(dist.NextNumber (5UL, 5), Is.EqualTo(5));
Assert.That(await dist.NextNumber(0UL, 0), Is.EqualTo(0)); Assert.That(dist.NextNumber (0UL, 0), Is.EqualTo(0));
Assert.That(await dist.NextNumber(3_000_000_000UL, 3_000_000_000), Is.EqualTo(3_000_000_000)); Assert.That(dist.NextNumber (3_000_000_000UL, 3_000_000_000), Is.EqualTo(3_000_000_000));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange02Float() public void TestRange02Float()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5f, 5f), Is.EqualTo(5)); Assert.That(dist.NextNumber (5f, 5f), Is.EqualTo(5));
Assert.That(await dist.NextNumber(0f, 0f), Is.EqualTo(0)); Assert.That(dist.NextNumber (0f, 0f), Is.EqualTo(0));
Assert.That(await dist.NextNumber(3e9f, 3e9f), Is.EqualTo(3e9f)); Assert.That(dist.NextNumber (3e9f, 3e9f), Is.EqualTo(3e9f));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange03Uint() public void TestRange03Uint()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5, 6), Is.InRange(5, 6)); Assert.That(dist.NextNumber (5, 6), Is.InRange(5, 6));
Assert.That(await dist.NextNumber(0, 1), Is.InRange(0, 1)); Assert.That(dist.NextNumber (0, 1), Is.InRange(0, 1));
Assert.That(await dist.NextNumber(3_000_000_000, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002)); Assert.That(dist.NextNumber (3_000_000_000, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange03Ulong() public void TestRange03Ulong()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5UL, 6), Is.InRange(5, 6)); Assert.That(dist.NextNumber (5UL, 6), Is.InRange(5, 6));
Assert.That(await dist.NextNumber(0UL, 1), Is.InRange(0, 1)); Assert.That(dist.NextNumber (0UL, 1), Is.InRange(0, 1));
Assert.That(await dist.NextNumber(3_000_000_000UL, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002)); Assert.That(dist.NextNumber (3_000_000_000UL, 3_000_000_002), Is.InRange(3_000_000_000, 3_000_000_002));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange03Float() public void TestRange03Float()
{ {
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(5f, 6f), Is.InRange(5f, 6f)); Assert.That(dist.NextNumber (5f, 6f), Is.InRange(5f, 6f));
Assert.That(await dist.NextNumber(0f, 1f), Is.InRange(0f, 1f)); Assert.That(dist.NextNumber (0f, 1f), Is.InRange(0f, 1f));
Assert.That(await dist.NextNumber(3e9f, 3e9f+2f), Is.InRange(3e9f, 3e9f+2f)); Assert.That(dist.NextNumber (3e9f, 3e9f+2f), Is.InRange(3e9f, 3e9f+2f));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange04Uint() public void TestRange04Uint()
{ {
var distUniform = new Uniform<float>(this.rng); var distUniform = new Uniform<float>(this.rng);
var distNormal = new NormalS02M05<float>(this.rng); var distNormal = new NormalS02M05<float>(this.rng);
Assert.That(await distUniform.NextNumber(10, 1), Is.InRange(1, 10)); Assert.That(distUniform.NextNumber(10, 1), Is.InRange(1, 10));
Assert.That(await distNormal.NextNumber(10, 1), Is.InRange(1, 10)); Assert.That(distNormal.NextNumber(10, 1), Is.InRange(1, 10));
Assert.That(await distUniform.NextNumber(20, 1), Is.InRange(1, 20)); Assert.That(distUniform.NextNumber(20, 1), Is.InRange(1, 20));
Assert.That(await distNormal.NextNumber(20, 1), Is.InRange(1, 20)); Assert.That(distNormal.NextNumber(20, 1), Is.InRange(1, 20));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange04Ulong() public void TestRange04Ulong()
{ {
var distUniform = new Uniform<float>(this.rng); var distUniform = new Uniform<float>(this.rng);
var distNormal = new NormalS02M05<float>(this.rng); var distNormal = new NormalS02M05<float>(this.rng);
Assert.That(await distUniform.NextNumber(10UL, 1), Is.InRange(1, 10)); Assert.That(distUniform.NextNumber(10UL, 1), Is.InRange(1, 10));
Assert.That(await distNormal.NextNumber(10UL, 1), Is.InRange(1, 10)); Assert.That(distNormal.NextNumber(10UL, 1), Is.InRange(1, 10));
Assert.That(await distUniform.NextNumber(20UL, 1), Is.InRange(1, 20)); Assert.That(distUniform.NextNumber(20UL, 1), Is.InRange(1, 20));
Assert.That(await distNormal.NextNumber(20UL, 1), Is.InRange(1, 20)); Assert.That(distNormal.NextNumber(20UL, 1), Is.InRange(1, 20));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestRange04Float() public void TestRange04Float()
{ {
var distUniform = new Uniform<float>(this.rng); var distUniform = new Uniform<float>(this.rng);
var distNormal = new NormalS02M05<float>(this.rng); var distNormal = new NormalS02M05<float>(this.rng);
Assert.That(await distUniform.NextNumber(10.0f, 1), Is.InRange(1, 10)); Assert.That(distUniform.NextNumber(10.0f, 1), Is.InRange(1, 10));
Assert.That(await distNormal.NextNumber(10.0f, 1), Is.InRange(1, 10)); Assert.That(distNormal.NextNumber(10.0f, 1), Is.InRange(1, 10));
Assert.That(await distUniform.NextNumber(20.0f, 1), Is.InRange(1, 20)); Assert.That(distUniform.NextNumber(20.0f, 1), Is.InRange(1, 20));
Assert.That(await distNormal.NextNumber(20.0f, 1), Is.InRange(1, 20)); Assert.That(distNormal.NextNumber(20.0f, 1), Is.InRange(1, 20));
} }
[Test] [Test]
[Category(TestCategories.LONG_RUNNING)] [Category(TestCategories.LONG_RUNNING)]
public async Task TestRange05() public void TestRange05()
{ {
var distUniform = new Uniform<float>(this.rng); var distUniform = new Uniform<float>(this.rng);
var distLorentz = new CauchyLorentzX1<float>(this.rng); var distLorentz = new CauchyLorentzX1<float>(this.rng);
@ -173,9 +171,9 @@ public class MultiThreadedRngTests
for (int i = 0; i < 100_000_000; i++) for (int i = 0; i < 100_000_000; i++)
{ {
var rngValue = await this.rng.GetUniform(); var rngValue = this.rng.GetUniform();
var uniform = await distUniform.NextNumber(); var uniform = distUniform.NextNumber();
var lorentz = await distLorentz.NextNumber(); var lorentz = distLorentz.NextNumber();
switch (rngValue) switch (rngValue)
{ {
@ -228,7 +226,7 @@ public class MultiThreadedRngTests
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestStoppingProducers01() public void TestStoppingProducers01()
{ {
var rng2 = new MultiThreadedRng<float>(); var rng2 = new MultiThreadedRng<float>();
rng2.Dispose(); rng2.Dispose();
@ -239,7 +237,7 @@ public class MultiThreadedRngTests
while(true) while(true)
{ {
var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3)); var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await rng2.GetUniform(tokenSource.Token); rng2.GetUniform(tokenSource.Token);
if (tokenSource.IsCancellationRequested) if (tokenSource.IsCancellationRequested)
{ {
wasCanceled = true; wasCanceled = true;
@ -256,26 +254,26 @@ public class MultiThreadedRngTests
Assert.That(wasCanceled, Is.True, "The consumer was not canceled"); Assert.That(wasCanceled, Is.True, "The consumer was not canceled");
var tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3)); var tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await new NormalS02M05<float>(rng2).NextNumber(tokenSource2.Token); new NormalS02M05<float>(rng2).NextNumber(tokenSource2.Token);
Assert.That(tokenSource2.IsCancellationRequested, Is.True); Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3)); tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await new NormalS02M05<float>(rng2).NextNumber(-1f, 1f, tokenSource2.Token); new NormalS02M05<float>(rng2).NextNumber(-1f, 1f, tokenSource2.Token);
Assert.That(tokenSource2.IsCancellationRequested, Is.True); Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3)); tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await new NormalS02M05<float>(rng2).NextNumber(0u, 6u, tokenSource2.Token); new NormalS02M05<float>(rng2).NextNumber(0u, 6u, tokenSource2.Token);
Assert.That(tokenSource2.IsCancellationRequested, Is.True); Assert.That(tokenSource2.IsCancellationRequested, Is.True);
tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3)); tokenSource2 = new CancellationTokenSource(TimeSpan.FromSeconds(3));
await new NormalS02M05<float>(rng2).NextNumber(0ul, 6ul, tokenSource2.Token); new NormalS02M05<float>(rng2).NextNumber(0ul, 6ul, tokenSource2.Token);
Assert.That(tokenSource2.IsCancellationRequested, Is.True); Assert.That(tokenSource2.IsCancellationRequested, Is.True);
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task OneSeed01() public void OneSeed01()
{ {
using var rng1 = new MultiThreadedRng<float>(6); using var rng1 = new MultiThreadedRng<float>(6);
using var rng2 = new MultiThreadedRng<float>(6); using var rng2 = new MultiThreadedRng<float>(6);
@ -283,15 +281,15 @@ public class MultiThreadedRngTests
var rng1Sample = new float[10]; var rng1Sample = new float[10];
for (var n = 0; n < rng1Sample.Length; n++) for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform(); rng1Sample[n] = rng1.GetUniform();
var rng2Sample = new float[10]; var rng2Sample = new float[10];
for (var n = 0; n < rng2Sample.Length; n++) for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform(); rng2Sample[n] = rng2.GetUniform();
var rng3Sample = new float[10]; var rng3Sample = new float[10];
for (var n = 0; n < rng3Sample.Length; n++) for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform(); rng3Sample[n] = rng3.GetUniform();
Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample)); Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample)); Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
@ -301,7 +299,7 @@ public class MultiThreadedRngTests
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TwoSeeds01() public void TwoSeeds01()
{ {
using var rng1 = new MultiThreadedRng<float>(3, 6); using var rng1 = new MultiThreadedRng<float>(3, 6);
using var rng2 = new MultiThreadedRng<float>(3, 6); using var rng2 = new MultiThreadedRng<float>(3, 6);
@ -310,19 +308,19 @@ public class MultiThreadedRngTests
var rng1Sample = new float[10]; var rng1Sample = new float[10];
for (var n = 0; n < rng1Sample.Length; n++) for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform(); rng1Sample[n] = rng1.GetUniform();
var rng2Sample = new float[10]; var rng2Sample = new float[10];
for (var n = 0; n < rng2Sample.Length; n++) for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform(); rng2Sample[n] = rng2.GetUniform();
var rng3Sample = new float[10]; var rng3Sample = new float[10];
for (var n = 0; n < rng3Sample.Length; n++) for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform(); rng3Sample[n] = rng3.GetUniform();
var rng4Sample = new float[10]; var rng4Sample = new float[10];
for (var n = 0; n < rng4Sample.Length; n++) for (var n = 0; n < rng4Sample.Length; n++)
rng4Sample[n] = await rng4.GetUniform(); rng4Sample[n] = rng4.GetUniform();
Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample)); Assert.That(rng1Sample, Is.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample)); Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
@ -335,7 +333,7 @@ public class MultiThreadedRngTests
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task NoSeed01() public void NoSeed01()
{ {
using var rng1 = new MultiThreadedRng<float>(); using var rng1 = new MultiThreadedRng<float>();
using var rng2 = new MultiThreadedRng<float>(); using var rng2 = new MultiThreadedRng<float>();
@ -343,15 +341,15 @@ public class MultiThreadedRngTests
var rng1Sample = new float[10]; var rng1Sample = new float[10];
for (var n = 0; n < rng1Sample.Length; n++) for (var n = 0; n < rng1Sample.Length; n++)
rng1Sample[n] = await rng1.GetUniform(); rng1Sample[n] = rng1.GetUniform();
var rng2Sample = new float[10]; var rng2Sample = new float[10];
for (var n = 0; n < rng2Sample.Length; n++) for (var n = 0; n < rng2Sample.Length; n++)
rng2Sample[n] = await rng2.GetUniform(); rng2Sample[n] = rng2.GetUniform();
var rng3Sample = new float[10]; var rng3Sample = new float[10];
for (var n = 0; n < rng3Sample.Length; n++) for (var n = 0; n < rng3Sample.Length; n++)
rng3Sample[n] = await rng3.GetUniform(); rng3Sample[n] = rng3.GetUniform();
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng2Sample)); Assert.That(rng1Sample, Is.Not.EquivalentTo(rng2Sample));
Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample)); Assert.That(rng1Sample, Is.Not.EquivalentTo(rng3Sample));
@ -361,7 +359,7 @@ public class MultiThreadedRngTests
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCancellation01() public void TestCancellation01()
{ {
var tokenSource = new CancellationTokenSource(); var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token; var token = tokenSource.Token;
@ -369,257 +367,257 @@ public class MultiThreadedRngTests
using var rng2 = new MultiThreadedRng<float>(); using var rng2 = new MultiThreadedRng<float>();
var dist = new Uniform<float>(this.rng); var dist = new Uniform<float>(this.rng);
Assert.That(await dist.NextNumber(1, 100_000, token), Is.EqualTo(0)); Assert.That(dist.NextNumber (1, 100_000, token), Is.EqualTo(0));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestCancellation02() public void TestCancellation02()
{ {
var tokenSource = new CancellationTokenSource(); var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token; var token = tokenSource.Token;
tokenSource.Cancel(); tokenSource.Cancel();
using var rng2 = new MultiThreadedRng<float>(); using var rng2 = new MultiThreadedRng<float>();
Assert.That(await rng2.GetUniform(token), Is.NaN); Assert.That(rng2.GetUniform(token), Is.NaN);
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic01() public void TestDeterministic01()
{ {
using var rng2 = new MultiThreadedRng<float>(16); using var rng2 = new MultiThreadedRng<float>(16);
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.12712699).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.12712699).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.5764246).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.5764246).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.06033641).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.06033641).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.6822646).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.6822646).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.61201024).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.61201024).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.17746393).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.17746393).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.33456334).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.33456334).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.96167856).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.96167856).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.12944269).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.12944269).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.64489424).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.64489424).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.109665975).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.109665975).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.18188846).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.18188846).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.36097932).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.36097932).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.48192585).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.48192585).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.1617974).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.1617974).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.24791045).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.24791045).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.43913218).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.43913218).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.3343723).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.3343723).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.9428737).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.9428737).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.55195147).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.55195147).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.027495692).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.027495692).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.9621458).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.9621458).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.55794334).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.55794334).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.69002056).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.69002056).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.86020225).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.86020225).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.88220626).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.88220626).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.68816894).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.68816894).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.8583311).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.8583311).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.003915685).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.003915685).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.83575225).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.83575225).Within(1e-7f));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic02() public void TestDeterministic02()
{ {
using var rng2 = new MultiThreadedRng<float>(16); using var rng2 = new MultiThreadedRng<float>(16);
var dist = new Uniform<float>(rng2); var dist = new Uniform<float>(rng2);
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(13)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(13));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(58)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(58));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(6)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(6));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(68)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(68));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(61)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(61));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(18)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(18));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(34)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(34));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(96)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(96));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(13)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(13));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(64)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(64));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(19)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(19));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(36)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(36));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(48)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(48));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(17)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(17));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(25)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(25));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(44)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(44));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(34)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(34));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(94)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(94));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(55)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(55));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(96)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(96));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(56)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(56));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(69)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(69));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(86)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(86));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(88)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(88));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(69)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(69));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(85)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(85));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(83)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(83));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic03() public void TestDeterministic03()
{ {
using var rng2 = new MultiThreadedRng<float>(16); using var rng2 = new MultiThreadedRng<float>(16);
var dist = new CauchyLorentzX0<float>(rng2); var dist = new CauchyLorentzX0<float>(rng2);
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(17)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(17));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(18)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(18));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(14)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(14));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(65)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(65));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(22)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(22));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(37)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(37));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(9)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(9));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(12)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(12));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(10)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(10));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(8)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(8));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(22)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(22));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(20)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(20));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(84)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(84));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(9)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(9));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(19)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(19));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(10)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(10));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(56)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(56));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic01b() public void TestDeterministic01b()
{ {
using var rng2 = new MultiThreadedRng<float>(16, 362_436_069); using var rng2 = new MultiThreadedRng<float>(16, 362_436_069);
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.12712699).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.12712699).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.5764246).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.5764246).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.06033641).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.06033641).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.6822646).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.6822646).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.61201024).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.61201024).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.17746393).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.17746393).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.33456334).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.33456334).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.96167856).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.96167856).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.12944269).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.12944269).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.64489424).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.64489424).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.109665975).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.109665975).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.18188846).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.18188846).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.36097932).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.36097932).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.48192585).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.48192585).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.1617974).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.1617974).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.24791045).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.24791045).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.43913218).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.43913218).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.3343723).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.3343723).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.9428737).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.9428737).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.55195147).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.55195147).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.027495692).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.027495692).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.9621458).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.9621458).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.55794334).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.55794334).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.69002056).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.69002056).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.86020225).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.86020225).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.88220626).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.88220626).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.68816894).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.68816894).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.8583311).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.8583311).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.003915685).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.003915685).Within(1e-7f));
Assert.That(await rng2.GetUniform(), Is.EqualTo(0.83575225).Within(1e-7f)); Assert.That(rng2.GetUniform(), Is.EqualTo(0.83575225).Within(1e-7f));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic02b() public void TestDeterministic02b()
{ {
using var rng2 = new MultiThreadedRng<float>(16, 362_436_069); using var rng2 = new MultiThreadedRng<float>(16, 362_436_069);
var dist = new Uniform<float>(rng2); var dist = new Uniform<float>(rng2);
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(13)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(13));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(58)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(58));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(6)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(6));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(68)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(68));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(61)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(61));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(18)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(18));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(34)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(34));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(96)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(96));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(13)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(13));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(64)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(64));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(19)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(19));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(36)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(36));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(48)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(48));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(17)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(17));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(25)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(25));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(44)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(44));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(34)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(34));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(94)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(94));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(55)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(55));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(96)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(96));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(56)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(56));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(69)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(69));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(86)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(86));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(88)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(88));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(69)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(69));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(85)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(85));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(83)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(83));
} }
[Test] [Test]
[Category(TestCategories.COVER)] [Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)] [Category(TestCategories.NORMAL)]
public async Task TestDeterministic03b() public void TestDeterministic03b()
{ {
using var rng2 = new MultiThreadedRng<float>(16, 362_436_069); using var rng2 = new MultiThreadedRng<float>(16, 362_436_069);
var dist = new CauchyLorentzX0<float>(rng2); var dist = new CauchyLorentzX0<float>(rng2);
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(17)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(17));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(18)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(18));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(14)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(14));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(65)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(65));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(11)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(11));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(22)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(22));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(37)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(37));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(9)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(9));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(12)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(12));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(10)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(10));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(8)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(8));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(22)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(22));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(3)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(3));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(20)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(20));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(84)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(84));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(9)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(9));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(19)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(19));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(2)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(2));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(1)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(1));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(10)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(10));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(4)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(4));
Assert.That(await dist.NextNumber(1, 100), Is.EqualTo(56)); Assert.That(dist.NextNumber (1, 100), Is.EqualTo(56));
} }
} }

View File

@ -18,7 +18,7 @@ public class PerformanceTests
[Test] [Test]
[Category(TestCategories.PERFORMANCE)] [Category(TestCategories.PERFORMANCE)]
public async Task Generate1MUniform() public async Task Generate1MUniformMultiThreaded()
{ {
using var rng = new MultiThreadedRng<float>(); using var rng = new MultiThreadedRng<float>();
var data = new float[1_000_000]; var data = new float[1_000_000];
@ -27,7 +27,25 @@ public class PerformanceTests
stopwatch.Start(); stopwatch.Start();
for (uint n = 0; n < data.Length; n++) for (uint n = 0; n < data.Length; n++)
data[n] = await rng.GetUniform(); data[n] = rng.GetUniform();
stopwatch.Stop();
TestContext.WriteLine($"Generated 1M uniform distributed random numbers in {stopwatch.Elapsed.Minutes} minute(s), {stopwatch.Elapsed.Seconds} second(s), and {stopwatch.Elapsed.Milliseconds} milliseconds.");
}
[Test]
[Category(TestCategories.PERFORMANCE)]
public async Task Generate1MUniformMultiChannel()
{
using var rng = new MultiChannelRng<float>();
var data = new float[1_000_000];
var stopwatch = new Stopwatch();
Thread.Sleep(TimeSpan.FromSeconds(10)); // Warm-up phase of generator
stopwatch.Start();
for (uint n = 0; n < data.Length; n++)
data[n] = rng.GetUniform();
stopwatch.Stop(); stopwatch.Stop();
@ -46,7 +64,7 @@ public class PerformanceTests
stopwatch.Start(); stopwatch.Start();
for (uint n = 0; n < data.Length; n++) for (uint n = 0; n < data.Length; n++)
data[n] = await dist.NextNumber(); data[n] = dist.NextNumber();
stopwatch.Stop(); stopwatch.Stop();
@ -65,7 +83,7 @@ public class PerformanceTests
stopwatch.Start(); stopwatch.Start();
for (uint n = 0; n < data.Length; n++) for (uint n = 0; n < data.Length; n++)
data[n] = await dist.NextNumber(); data[n] = dist.NextNumber();
stopwatch.Stop(); stopwatch.Stop();