Added beta variations
This commit is contained in:
		
							parent
							
								
									819dfd8a2e
								
							
						
					
					
						commit
						95e237f562
					
				
							
								
								
									
										40
									
								
								FastRng/Double/Distributions/BetaA2B5.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								FastRng/Double/Distributions/BetaA2B5.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Threading;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FastRng.Double.Distributions
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public sealed class BetaA2B5 : IDistribution
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private const double ALPHA = 2;
 | 
				
			||||||
 | 
					        private const double BETA = 5;
 | 
				
			||||||
 | 
					        private const double CONSTANT = 12.2;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        private ShapeFitter fitter;
 | 
				
			||||||
 | 
					        private IRandom random;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public BetaA2B5()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        public IRandom Random
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get => this.random;
 | 
				
			||||||
 | 
					            set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                this.random = value;
 | 
				
			||||||
 | 
					                this.fitter = new ShapeFitter(BetaA2B5.ShapeFunction, this.random, 100);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private static double ShapeFunction(double x) => CONSTANT * Math.Pow(x, ALPHA - 1) * Math.Pow(1 - x, BETA - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public async ValueTask<double> GetDistributedValue(CancellationToken token = default)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (this.Random == null)
 | 
				
			||||||
 | 
					                return double.NaN;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return await this.fitter.NextNumber(token);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										40
									
								
								FastRng/Double/Distributions/BetaA5B2.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								FastRng/Double/Distributions/BetaA5B2.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,40 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Threading;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FastRng.Double.Distributions
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    public sealed class BetaA5B2 : IDistribution
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        private const double ALPHA = 5;
 | 
				
			||||||
 | 
					        private const double BETA = 2;
 | 
				
			||||||
 | 
					        private const double CONSTANT = 12.2;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        private ShapeFitter fitter;
 | 
				
			||||||
 | 
					        private IRandom random;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public BetaA5B2()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        public IRandom Random
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            get => this.random;
 | 
				
			||||||
 | 
					            set
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                this.random = value;
 | 
				
			||||||
 | 
					                this.fitter = new ShapeFitter(BetaA5B2.ShapeFunction, this.random, 100);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private static double ShapeFunction(double x) => CONSTANT * Math.Pow(x, ALPHA - 1) * Math.Pow(1 - x, BETA - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public async ValueTask<double> GetDistributedValue(CancellationToken token = default)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            if (this.Random == null)
 | 
				
			||||||
 | 
					                return double.NaN;
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            return await this.fitter.NextNumber(token);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										47
									
								
								FastRngTests/Double/Distributions/BetaA2B5.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								FastRngTests/Double/Distributions/BetaA2B5.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Diagnostics.CodeAnalysis;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FastRng.Double;
 | 
				
			||||||
 | 
					using NUnit.Framework;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FastRngTests.Double.Distributions
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [ExcludeFromCodeCoverage]
 | 
				
			||||||
 | 
					    public class BetaA2B5
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Test]
 | 
				
			||||||
 | 
					        [Category(TestCategories.COVER)]
 | 
				
			||||||
 | 
					        [Category(TestCategories.NORMAL)]
 | 
				
			||||||
 | 
					        public async Task TestBetaDistribution01()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var dist = new FastRng.Double.Distributions.BetaA2B5();
 | 
				
			||||||
 | 
					            var fqa = new FrequencyAnalysis();
 | 
				
			||||||
 | 
					            var rng = new MultiThreadedRng();
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            for (var n = 0; n < 100_000; n++)
 | 
				
			||||||
 | 
					                fqa.CountThis(await rng.NextNumber(dist));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            rng.StopProducer();
 | 
				
			||||||
 | 
					            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[0], Is.EqualTo(0.11719271).Within(0.3));
 | 
				
			||||||
 | 
					            Assert.That(result[1], Is.EqualTo(0.22505783).Within(0.3));
 | 
				
			||||||
 | 
					            Assert.That(result[2], Is.EqualTo(0.32401717).Within(0.3));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[21], Is.EqualTo(0.99348410).Within(0.3));
 | 
				
			||||||
 | 
					            Assert.That(result[22], Is.EqualTo(0.98639433).Within(0.3));
 | 
				
			||||||
 | 
					            Assert.That(result[23], Is.EqualTo(0.97684451).Within(0.3));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[50], Is.EqualTo(0.35868592).Within(0.3));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[75], Is.EqualTo(0.03076227).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[85], Is.EqualTo(0.00403061).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[90], Is.EqualTo(0.00109800).Within(0.01));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[97], Is.EqualTo(0.00000191).Within(0.000003));
 | 
				
			||||||
 | 
					            Assert.That(result[98], Is.EqualTo(0.00000012).Within(0.0000003));
 | 
				
			||||||
 | 
					            Assert.That(result[99], Is.EqualTo(0.00000000).Within(0.0000003));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										47
									
								
								FastRngTests/Double/Distributions/BetaA5B2.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								FastRngTests/Double/Distributions/BetaA5B2.cs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,47 @@
 | 
				
			|||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using System.Diagnostics.CodeAnalysis;
 | 
				
			||||||
 | 
					using System.Linq;
 | 
				
			||||||
 | 
					using System.Threading.Tasks;
 | 
				
			||||||
 | 
					using FastRng.Double;
 | 
				
			||||||
 | 
					using NUnit.Framework;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace FastRngTests.Double.Distributions
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [ExcludeFromCodeCoverage]
 | 
				
			||||||
 | 
					    public class BetaA5B2
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        [Test]
 | 
				
			||||||
 | 
					        [Category(TestCategories.COVER)]
 | 
				
			||||||
 | 
					        [Category(TestCategories.NORMAL)]
 | 
				
			||||||
 | 
					        public async Task TestBetaDistribution01()
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            var dist = new FastRng.Double.Distributions.BetaA5B2();
 | 
				
			||||||
 | 
					            var fqa = new FrequencyAnalysis();
 | 
				
			||||||
 | 
					            var rng = new MultiThreadedRng();
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            for (var n = 0; n < 100_000; n++)
 | 
				
			||||||
 | 
					                fqa.CountThis(await rng.NextNumber(dist));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            rng.StopProducer();
 | 
				
			||||||
 | 
					            var result = fqa.NormalizeAndPlotEvents(TestContext.WriteLine);
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[0], Is.EqualTo(0.0000001).Within(0.0000003));
 | 
				
			||||||
 | 
					            Assert.That(result[1], Is.EqualTo(0.0000019).Within(0.0000020));
 | 
				
			||||||
 | 
					            Assert.That(result[2], Is.EqualTo(0.0000096).Within(0.0000100));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[21], Is.EqualTo(0.0222918).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[22], Is.EqualTo(0.0262883).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[23], Is.EqualTo(0.0307623).Within(0.03));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[50], Is.EqualTo(0.4044237).Within(0.2));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[75], Is.EqualTo(0.9768445).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[85], Is.EqualTo(0.9552714).Within(0.05));
 | 
				
			||||||
 | 
					            Assert.That(result[90], Is.EqualTo(0.8004420).Within(0.15));
 | 
				
			||||||
 | 
					            
 | 
				
			||||||
 | 
					            Assert.That(result[97], Is.EqualTo(0.2250578).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[98], Is.EqualTo(0.1171927).Within(0.03));
 | 
				
			||||||
 | 
					            Assert.That(result[99], Is.EqualTo(0.0000000).Within(0.00));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user