| using System; |
|
|
| namespace Unity.MLAgents.Inference.Utils |
| { |
| |
| |
| |
| |
| |
| |
| internal class RandomNormal |
| { |
| readonly double m_Mean; |
| readonly double m_Stddev; |
| readonly Random m_Random; |
|
|
| public RandomNormal(int seed, float mean = 0.0f, float stddev = 1.0f) |
| { |
| m_Mean = mean; |
| m_Stddev = stddev; |
| m_Random = new Random(seed); |
| } |
|
|
| |
| bool m_HasSpare; |
| double m_SpareUnscaled; |
|
|
| |
| |
| |
| |
| public double NextDouble() |
| { |
| if (m_HasSpare) |
| { |
| m_HasSpare = false; |
| return m_SpareUnscaled * m_Stddev + m_Mean; |
| } |
|
|
| double u, v, s; |
| do |
| { |
| u = m_Random.NextDouble() * 2.0 - 1.0; |
| v = m_Random.NextDouble() * 2.0 - 1.0; |
| s = u * u + v * v; |
| } |
| while (s >= 1.0 || Math.Abs(s) < double.Epsilon); |
|
|
| s = Math.Sqrt(-2.0 * Math.Log(s) / s); |
| m_SpareUnscaled = u * s; |
| m_HasSpare = true; |
|
|
| return v * s * m_Stddev + m_Mean; |
| } |
| } |
| } |
|
|