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;
      }
    }
  }
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).
Compute the next randomn value using the von Neumann algorithm . Requires sequences of uniformly - distributed random values in [ 0 1 ) .