FastRng/FastRngTests/FrequencyAnalysis.cs

83 lines
2.1 KiB
C#
Raw Normal View History

2020-11-01 09:52:42 +00:00
using System;
2020-11-07 21:43:03 +00:00
using System.Diagnostics.CodeAnalysis;
2020-11-01 09:52:42 +00:00
using System.Linq;
using System.Text;
namespace FastRngTests;
[ExcludeFromCodeCoverage]
public sealed class FrequencyAnalysis
2020-11-01 09:52:42 +00:00
{
private readonly uint[] data;
2020-11-01 09:52:42 +00:00
public FrequencyAnalysis(int samples = 100)
{
this.data = new uint[samples];
}
2020-11-01 09:52:42 +00:00
public void CountThis(float value)
{
var bucket = (int)MathF.Floor(value * this.data.Length);
this.data[bucket]++;
}
2020-11-01 09:52:42 +00:00
public float[] GetNormalizedEvents()
{
var max = (float) this.data.Max();
var result = new float[this.data.Length];
for (var n = 0; n < this.data.Length; n++)
2020-11-01 09:52:42 +00:00
{
result[n] = this.data[n] / max;
2020-11-01 09:52:42 +00:00
}
return result;
}
2020-11-01 09:52:42 +00:00
private float[] Normalize()
{
var max = (float)this.data.Max();
var result = new float[this.data.Length];
for (var n = 0; n < this.data.Length; n++)
result[n] = this.data[n] / max;
2020-11-01 09:52:42 +00:00
return result;
}
public float[] NormalizeAndPlotEvents(Action<string> writer)
{
var result = this.Normalize();
Plot(result, writer, "Event Distribution");
2020-11-01 09:52:42 +00:00
return result;
}
2020-11-01 09:52:42 +00:00
public void PlotOccurence(Action<string> writer)
{
var data = this.data.Select(n => n > 0f ? 1.0f : 0.0f).ToArray();
Plot(data, writer, "Occurrence Distribution");
}
private static void Plot(float[] data, Action<string> writer, string name)
{
const int HEIGHT = 16;
var values = new float[data.Length];
for (var n = 0; n < data.Length; n++)
2020-11-01 09:52:42 +00:00
{
values[n] = data[n] * HEIGHT;
2020-11-01 09:52:42 +00:00
}
var sb = new StringBuilder();
for (var line = HEIGHT; line > 0; line--)
2020-11-01 09:52:42 +00:00
{
for (var column = 0; column < data.Length; column++)
sb.Append(values[column] >= line ? '█' : '░');
2020-11-01 09:52:42 +00:00
writer.Invoke(sb.ToString());
sb.Clear();
2020-11-01 09:52:42 +00:00
}
writer.Invoke(name);
writer.Invoke(string.Empty);
2020-11-01 09:52:42 +00:00
}
}