FastRng/FastRngTests/DecisionTester.cs

61 lines
2.3 KiB
C#
Raw Normal View History

2020-11-07 21:43:57 +00:00
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using System.Threading.Tasks;
2023-07-06 08:08:46 +00:00
using FastRng;
using FastRng.Distributions;
using FastRngTests.Distributions;
2020-11-07 21:43:57 +00:00
using NUnit.Framework;
namespace FastRngTests;
[ExcludeFromCodeCoverage]
public class DecisionTester
2020-11-07 21:43:57 +00:00
{
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task DecisionUniform01()
2020-11-07 21:43:57 +00:00
{
using var rng = new MultiThreadedRng<float>();
var dist = new Uniform<float>(rng);
var neededCoinTossesA = 0;
var neededCoinTossesB = 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 (!await dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++;
var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC};
var max = values.Max();
var min = values.Min();
2020-11-07 21:43:57 +00:00
TestContext.WriteLine($"Coin tosses: a={neededCoinTossesA}, b={neededCoinTossesB}, c={neededCoinTossesC}");
Assert.That(max - min, Is.LessThanOrEqualTo(250));
}
2020-11-07 21:43:57 +00:00
[Test]
[Category(TestCategories.COVER)]
[Category(TestCategories.NORMAL)]
public async Task DecisionWeibull01()
{
using var rng = new MultiThreadedRng<float>();
var dist = new WeibullK05La1<float>(rng);
var neededCoinTossesA = 0;
var neededCoinTossesB = 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 (!await dist.HasDecisionBeenMade(0.5f, 0.6f)) neededCoinTossesB++;
for(var n = 0; n < 100; n++) while (!await dist.HasDecisionBeenMade(0.8f, 0.9f)) neededCoinTossesC++;
var values = new[] {neededCoinTossesA, neededCoinTossesB, neededCoinTossesC};
var max = values.Max();
var min = values.Min();
2020-11-07 21:43:57 +00:00
TestContext.WriteLine($"Coin tosses: a={neededCoinTossesA}, b={neededCoinTossesB}, c={neededCoinTossesC}");
Assert.That(max - min, Is.LessThanOrEqualTo(2_800));
2020-11-07 21:43:57 +00:00
}
}