dlarnv function

void dlarnv(
  1. int IDIST,
  2. Array<int> ISEED_,
  3. int N,
  4. Array<double> X_,
)

Implementation

void dlarnv(
  final int IDIST,
  final Array<int> ISEED_,
  final int N,
  final Array<double> X_,
) {
  final X = X_.having();
  final ISEED = ISEED_.having();
  const ONE = 1.0, TWO = 2.0;
  const LV = 128;
  const TWOPI = 6.28318530717958647692528676655900576839;
  int I, IL, IL2, IV;
  final U = Array<double>(LV);

  for (IV = 1; IV <= N; IV += LV ~/ 2) {
    IL = min(LV ~/ 2, N - IV + 1);
    if (IDIST == 3) {
      IL2 = 2 * IL;
    } else {
      IL2 = IL;
    }

    // Call DLARUV to generate IL2 numbers from a uniform (0,1)
    // distribution (IL2 <= LV)

    dlaruv(ISEED, IL2, U);

    if (IDIST == 1) {
      // Copy generated numbers

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = U[I];
      }
    } else if (IDIST == 2) {
      // Convert generated numbers to uniform (-1,1) distribution

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = TWO * U[I] - ONE;
      }
    } else if (IDIST == 3) {
      // Convert generated numbers to normal (0,1) distribution

      for (I = 1; I <= IL; I++) {
        X[IV + I - 1] = sqrt(-TWO * log(U[2 * I - 1])) * cos(TWOPI * U[2 * I]);
      }
    }
  }
}