diff --git a/Framework/Geometry/src/RandomPoint.cpp b/Framework/Geometry/src/RandomPoint.cpp
index 0b5040113fbe75b715e97798affe20bbffd19d5f..b6963147c0c382895cefb2e887bdb1e82ab80df8 100644
--- a/Framework/Geometry/src/RandomPoint.cpp
+++ b/Framework/Geometry/src/RandomPoint.cpp
@@ -25,12 +25,18 @@ namespace RandomPoint {
 Kernel::V3D localPointInCylinder(const Kernel::V3D &basis,
                                  const Kernel::V3D &alongAxis,
                                  double polarAngle, double radialLength) {
-  using boost::math::pow;
-  Mantid::Kernel::V3D basis2{1., 0., 0.};
-  if (basis.X() != 0. && basis.Z() != 0) {
-    const auto inverseXZSumSq = 1. / (pow<2>(basis.X()) + pow<2>(basis.Z()));
-    basis2.setX(std::sqrt(1. - pow<2>(basis.X()) * inverseXZSumSq));
-    basis2.setZ(basis.X() * std::sqrt(inverseXZSumSq));
+  // Use basis to get a second perpendicular vector to define basis2
+  Kernel::V3D basis2;
+  if (basis.X() == 0) {
+    basis2.setX(1.);
+  } else if (basis.Y() == 0) {
+    basis2.setY(1.);
+  } else if (basis.Z() == 0) {
+    basis2.setZ(1.);
+  } else {
+    basis2.setX(-basis.Y());
+    basis2.setY(basis.X());
+    basis2.normalize();
   }
   const Kernel::V3D basis3{basis.cross_prod(basis2)};
   const Kernel::V3D localPoint{
@@ -76,8 +82,7 @@ Kernel::V3D inCylinder(const detail::ShapeInfo &shapeInfo,
   const double r{geometry.radius * std::sqrt(r2)};
   const double z{geometry.height * r3};
   const Kernel::V3D alongAxis{geometry.axis * z};
-  const Kernel::V3D &basis1{geometry.axis};
-  auto localPoint = localPointInCylinder(basis1, alongAxis, polar, r);
+  auto localPoint = localPointInCylinder(geometry.axis, alongAxis, polar, r);
   return localPoint + geometry.centreOfBottomBase;
 }
 
@@ -101,8 +106,7 @@ Kernel::V3D inHollowCylinder(const detail::ShapeInfo &shapeInfo,
   const double r{std::sqrt(c1 + (c2 - c1) * r2)};
   const double z{geometry.height * r3};
   const Kernel::V3D alongAxis{geometry.axis * z};
-  const Kernel::V3D &basis1{geometry.axis};
-  auto localPoint = localPointInCylinder(basis1, alongAxis, polar, r);
+  auto localPoint = localPointInCylinder(geometry.axis, alongAxis, polar, r);
   return localPoint + geometry.centreOfBottomBase;
 }
 
diff --git a/Framework/Geometry/test/RandomPointTest.h b/Framework/Geometry/test/RandomPointTest.h
index 0d8086931ae8edc4457215a2b8870bd2b874d2d8..1b870c8bf6b4f6d0a02d3f3408a5c0c6a6e910d2 100644
--- a/Framework/Geometry/test/RandomPointTest.h
+++ b/Framework/Geometry/test/RandomPointTest.h
@@ -285,10 +285,18 @@ public:
     constexpr V3D alongAxis{0., 0., 1.};
     constexpr V3D basis{1., 1., 1.}; // X and Z elements are not 0 here
 
-    Mantid::Kernel::V3D basis2{1., 0., 0.};
-    const auto inverseXZSumSq = 1. / (pow<2>(basis.X()) + pow<2>(basis.Z()));
-    basis2.setX(std::sqrt(1. - pow<2>(basis.X()) * inverseXZSumSq));
-    basis2.setZ(basis.X() * std::sqrt(inverseXZSumSq));
+    Mantid::Kernel::V3D basis2;
+    if (basis.X() == 0) {
+      basis2.setX(1.);
+    } else if (basis.Y() == 0) {
+      basis2.setY(1.);
+    } else if (basis.Z() == 0) {
+      basis2.setZ(1.);
+    } else {
+      basis2.setX(-basis.Y());
+      basis2.setY(basis.X());
+      basis2.normalize();
+    }
     const Mantid::Kernel::V3D basis3{basis.cross_prod(basis2)};
 
     auto localPoint =