Related to my earlier question -- I was wondering if there's a trivial way of generating a range of n random numbers according to a given distribution and parameters.

I wrote up the code below to generate a range of n uniformly-distributed numbers, but am not sure how to generalize it for arbitrary distribution and/or parameters, and I'm also not sure that I'm overcomplicating what might be more easily achieved with existing D functionality.

///////////////////////////////////////////////////////////////////////////////
import std.array, std.random, std.range, std.stdio;

struct UniformRange(T1, T2)
{
      T1 _lower;
      T2 _upper;

      @property enum bool empty = false;

      this(size_t n, T1 a, T2 b)
      {
            _lower = a;
            _upper = b;
      }

      @property auto ref front()
      {
            assert(!empty);
            return uniform(_lower, _upper);
      }

      void popFront()
      {
      }
}

auto uniformRange(T1, T2)(T1 a, T2 b)
{
      return UniformRange!(T1, T2)(a, b);
}

auto uniformRange(T1, T2)(size_t n, T1 a, T2 b)
{
      return take(UniformRange!(T1, T2)(n, a, b), n);
}

Reply via email to