| 125 | |
| 126 | template<class T> |
| 127 | void MersenneRNG::unitvector(T *p, int size) |
| 128 | { |
| 129 | for (;;) |
| 130 | { |
| 131 | T rsqr = 0; |
| 132 | for (int i = 0; i < size; i++) |
| 133 | { |
| 134 | p[i] = (T)unitrandom(); |
| 135 | rsqr += p[i]*p[i]; |
| 136 | } |
| 137 | |
| 138 | if (rsqr > 0 && rsqr <= 1) |
| 139 | { |
| 140 | rsqr = std::sqrt(rsqr); |
| 141 | for (int i = 0; i < size; i++) |
| 142 | p[i] /= rsqr; |
| 143 | break; |
| 144 | } |
| 145 | } |
| 146 | } |
| 147 | |
| 148 | template void DFHACK_EXPORT MersenneRNG::unitvector<float>(float *p, int size); |
| 149 | template void DFHACK_EXPORT MersenneRNG::unitvector<double>(double *p, int size); |
no test coverage detected