ph-math/src/main/java/com/helger/numbercruncher/mathutils/RandomExponential.java
public float nextVonNeumann ()
  {
    int n;
    int k = 0;
    float u1;

    // Loop to try sequences of uniformly-distributed
    // random values.
    for (;;)
    {
      n = 1;
      u1 = GENERATOR.nextFloat ();

      float u = u1;
      float uPrev = Float.NaN;

      // Loop to generate a sequence of ramdom values
      // as long as they are decreasing.
      for (;;)
      {
        uPrev = u;
        u = GENERATOR.nextFloat ();

        // No longer decreasing?
        if (u > uPrev)
        {

          // n is even.
          if ((n & 1) == 0)
          {
            return u1 + k; // return a random value
          }

          // n is odd.
          ++k;
          break; // try another sequence
        }

        ++n;
      }
    }
  }
public float nextVonNeumann ()
  {
    int n;
    int k = 0;
    float u1;

    // Loop to try sequences of uniformly-distributed
    // random values.
    for (;;)
    {
      n = 1;
      u1 = GENERATOR.nextFloat ();

      float u = u1;
      float uPrev = Float.NaN;

      // Loop to generate a sequence of ramdom values
      // as long as they are decreasing.
      for (;;)
      {
        uPrev = u;
        u = GENERATOR.nextFloat ();

        // No longer decreasing?
        if (u > uPrev)
        {

          // n is even.
          if ((n & 1) == 0)
          {
            return u1 + k; // return a random value
          }

          // n is odd.
          ++k;
          break; // try another sequence
        }

        ++n;
      }
    }
  }
Compute the next randomn value using the von Neumann algorithm. Requires
sequences of uniformly-distributed random values in [0, 1).