Loading...
Searching...
No Matches
RandomNumbers.cpp
Go to the documentation of this file.
1/*
2** This file is part of eOn.
3**
4** SPDX-License-Identifier: BSD-3-Clause
5**
6** Copyright (c) 2010--present, eOn Development Team
7** All rights reserved.
8**
9** Repo:
10** https://github.com/TheochemUI/eOn
11*/
12#include "eon/RandomNumbers.h"
13
14#include <cmath>
15
16double eonc::rng::random(long newSeed) {
17 static long seed = -1;
18 if (newSeed) {
19 seed = -newSeed;
20 }
21 int j;
22 long k;
23 static long seed2 = 123456789;
24 static long iy = 0;
25 static long iv[NTAB];
26 double temp;
27 if (seed <= 0) {
28 if (-(seed) < 1)
29 seed = 3;
30 else
31 seed = -(seed);
32 seed2 = (seed);
33 for (j = NTAB + 7; j >= 0; j--) {
34 k = (seed) / IQ1;
35 seed = IA1 * (seed - k * IQ1) - k * IR1;
36 if (seed < 0)
37 seed += IM1;
38 if (j < NTAB)
39 iv[j] = seed;
40 }
41 iy = iv[0];
42 }
43 k = (seed) / IQ1;
44 seed = IA1 * (seed - k * IQ1) - k * IR1;
45 if (seed < 0)
46 seed += IM1;
47 k = seed2 / IQ2;
48 seed2 = IA2 * (seed2 - k * IQ2) - k * IR2;
49 if (seed2 < 0)
50 seed2 += IM2;
51 j = int(iy / NDIV);
52 iy = iv[j] - seed2;
53 iv[j] = seed;
54 if (iy < 1)
55 iy += IMM1;
56 if ((temp = double(AM * iy)) > RNMX)
57 return RNMX;
58 else
59 return temp;
60}
61
62double eonc::rng::randomDouble() { return (random()); }
63
64double eonc::rng::randomDouble(int max) {
65 double dmax = double(max);
66 return (dmax * randomDouble());
67}
68
69double eonc::rng::randomDouble(long max) {
70 double dmax = double(max);
71 return (dmax * randomDouble());
72}
73
74double eonc::rng::randomDouble(double dmax) { return (dmax * randomDouble()); }
75
76long eonc::rng::randomInt(int lower, int upper) {
77 return lround((upper - lower) * randomDouble() + lower);
78}
79
80double eonc::rng::gaussRandom(double avg, double std) {
81 double r = 2, v1, v2, l, result;
82 while (r >= 1.0 || r < 1e-300) {
83 v1 = 2.0 * randomDouble() - 1.0;
84 v2 = 2.0 * randomDouble() - 1.0;
85 r = v1 * v1 + v2 * v2;
86 }
87 l = v1 * sqrt(-2.0 * ::log(r) / r);
88 result = avg + std * l;
89 return (result);
90}
double random(long newSeed=0)
long randomInt(int lower, int upper)
double randomDouble()
double gaussRandom(double avg, double std)
constexpr double AM
constexpr int NDIV
constexpr long IA2
constexpr long IR2
constexpr long IQ1
constexpr int NTAB
constexpr long IA1
constexpr long IQ2
constexpr long IM1
constexpr long IMM1
constexpr long IM2
constexpr long IR1
constexpr double RNMX