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;
|
2023-07-07 12:41:01 +00:00
|
|
|
using FastRng.Distributions;
|
|
|
|
using FastRngTests.Distributions;
|
2020-11-07 21:43:57 +00:00
|
|
|
using NUnit.Framework;
|
|
|
|
|
2023-07-06 08:26:12 +00:00
|
|
|
namespace FastRngTests;
|
|
|
|
|
|
|
|
[ExcludeFromCodeCoverage]
|
|
|
|
public class DecisionTester
|
2020-11-07 21:43:57 +00:00
|
|
|
{
|
2023-07-06 08:26:12 +00:00
|
|
|
[Test]
|
|
|
|
[Category(TestCategories.COVER)]
|
|
|
|
[Category(TestCategories.NORMAL)]
|
|
|
|
public async Task DecisionUniform01()
|
2020-11-07 21:43:57 +00:00
|
|
|
{
|
2023-07-07 12:41:01 +00:00
|
|
|
using var rng = new MultiThreadedRng<float>();
|
|
|
|
var dist = new Uniform<float>(rng);
|
2023-07-06 08:26:12 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
2023-07-06 08:26:12 +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
|
|
|
|
2023-07-06 08:26:12 +00:00
|
|
|
[Test]
|
|
|
|
[Category(TestCategories.COVER)]
|
|
|
|
[Category(TestCategories.NORMAL)]
|
|
|
|
public async Task DecisionWeibull01()
|
|
|
|
{
|
2023-07-07 12:41:01 +00:00
|
|
|
using var rng = new MultiThreadedRng<float>();
|
|
|
|
var dist = new WeibullK05La1<float>(rng);
|
2023-07-06 08:26:12 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
2023-07-06 08:26:12 +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
|
|
|
}
|
|
|
|
}
|