File: Utils\RandomNumberGenerator.cs
Web Access
Project: src\src\Microsoft.ML.AutoML\Microsoft.ML.AutoML.csproj (Microsoft.ML.AutoML)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System;
 
namespace Microsoft.ML.AutoMLService
{
    internal class RandomNumberGenerator
    {
        private readonly Random _random;
 
        public RandomNumberGenerator()
        {
            _random = new Random();
        }
 
        public RandomNumberGenerator(int seed)
        {
            _random = new Random(seed);
        }
 
        public int Integer(int high)
        {
            return _random.Next(high);
        }
 
        public double Uniform(double low, double high)
        {
            return (_random.NextDouble() * (high - low)) + low;
        }
 
        public double Normal(double location, double scale)
        {
            double u = 1 - Uniform(0, 1);
            double v = 1 - Uniform(0, 1);
            double std = Math.Sqrt(-2.0 * Math.Log(u)) * Math.Sin(2.0 * Math.PI * v);
            return location + (std * scale);
        }
 
        public double[] Normal(double location, double scale, int size)
        {
            double[] ret = new double[size];
            for (int i = 0; i < size; i++)
            {
                ret[i] = Normal(location, scale);
            }
 
            return ret;
        }
 
        public int Categorical(double[] possibility)
        {
            double x = Uniform(0, 1);
            for (int i = 0; i < possibility.Length; i++)
            {
                x -= possibility[i];
                if (x < 0) { return i; }
            }
 
            return possibility.Length - 1;
        }
 
        public int[] Categorical(double[] possibility, int size)
        {
            int[] ret = new int[size];
            for (int i = 0; i < ret.Length; i++)
            {
                ret[i] = Categorical(possibility);
            }
 
            return ret;
        }
    }
}