Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <random>
- void calcRandomVector(double *u){
- std::random_device rd;
- std::default_random_engine e(rd());
- typedef std::uniform_real_distribution<double> Dstr;
- Dstr unif{};
- double u1 = unif(e, Dstr::param_type{-1.0, 1.0});
- double u2 = unif(e, Dstr::param_type{-1.0+(u1*u1), 1.0-(u1*u1)});
- std::bernoulli_distribution bern_u3(0.5);
- double u3;
- if(bern_u3(e))
- u3 = -sqrt(1.0-u1*u1-u2*u2);
- else
- u3 = sqrt(1.0-u1*u1-u2*u2);
- u[0] = u1;
- u[1] = u2;
- u[2] = u3;
- }
- void orthogonalize(double *v, double *u){
- double factor = (v[0]*u[0]+v[1]*u[1]+v[2]*u[2])/(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
- u[0] = u[0] - factor * v[0];
- u[1] = u[1] - factor * v[1];
- u[2] = u[2] - factor * v[2];
- }
- int main(){
- double v[3] = {1.0, 0.0, 0.0}; // given vector
- double u[3];
- calcRandomVector(u);
- orthogonalize(v, u);
- std::cout << "Given vector: (" << v[0] << ", " << v[1] << ", " << v[2] << ")" << std::endl;
- std::cout << "Random orthonogal vector: (" << u[0] << ", " << u[1] << ", " << u[2] << ")" << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement