#region License Information
/* HeuristicLab
* Copyright (C) 2002-2019 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
*
* This file is part of HeuristicLab.
*
* HeuristicLab is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HeuristicLab is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HeuristicLab. If not, see .
*/
#endregion
using System;
using HeuristicLab.Common;
using HeuristicLab.Core;
using HEAL.Attic;
namespace HeuristicLab.Random {
///
/// Unformliy distributed random variable.
///
[Item("UniformDistributedRandom", "A pseudo random number generator to create uniform distributed random numbers.")]
[StorableType("01239E33-7AAD-467A-A95C-6D7E001F5827")]
public sealed class UniformDistributedRandom : Item, IRandom {
[Storable]
private double min;
///
/// Gets or sets the value for min.
///
public double Min {
get { return min; }
set { min = value; }
}
[Storable]
private double max;
///
/// Gets or sets the value for max.
///
public double Max {
get { return max; }
set { max = value; }
}
[Storable]
private IRandom uniform;
///
/// Used by HeuristicLab.Persistence to initialize new instances during deserialization.
///
/// true, if the constructor is called during deserialization.
[StorableConstructor]
private UniformDistributedRandom(StorableConstructorFlag _) : base(_) { }
///
/// Initializes a new instance from an existing one (copy constructor).
///
/// The original instance which is used to initialize the new instance.
/// A which is used to track all already cloned objects in order to avoid cycles.
private UniformDistributedRandom(UniformDistributedRandom original, Cloner cloner)
: base(original, cloner) {
uniform = cloner.Clone(original.uniform);
min = original.min;
max = original.max;
}
///
/// Initializes a new instance of with the given parameters.
///
/// The random number generator.
/// The minimal value (inclusive)
/// The maximal value (exclusive).
public UniformDistributedRandom(IRandom uniformRandom, double min, double max) {
this.min = min;
this.max = max;
this.uniform = uniformRandom;
}
#region IRandom Members
///
public void Reset() {
uniform.Reset();
}
///
public void Reset(int seed) {
uniform.Reset(seed);
}
///
/// This method is not implemented.
///
public int Next() {
throw new NotSupportedException();
}
///
/// This method is not implemented.
///
public int Next(int maxVal) {
throw new NotSupportedException();
}
///
/// This method is not implemented.
///
public int Next(int minVal, int maxVal) {
throw new NotSupportedException();
}
///
/// Generates a new double random number.
///
/// A double random number.
public double NextDouble() {
return UniformDistributedRandom.NextDouble(uniform, min, max);
}
#endregion
///
/// Clones the current instance (deep clone).
///
/// Deep clone through method of helper class
/// .
/// Dictionary of all already cloned objects. (Needed to avoid cycles.)
/// The cloned object as .
public override IDeepCloneable Clone(Cloner cloner) {
return new UniformDistributedRandom(this, cloner);
}
public static double NextDouble(IRandom uniformRandom, double min, double max) {
double range = max - min;
return uniformRandom.NextDouble() * range + min;
}
}
}