Make examples independent of ceres internals.

Change-Id: I6b6913e067a86fea713646218c8da1439d349d74
diff --git a/examples/bal_problem.cc b/examples/bal_problem.cc
index 5733f46..c118f88 100644
--- a/examples/bal_problem.cc
+++ b/examples/bal_problem.cc
@@ -35,7 +35,6 @@
 #include <string>
 #include <vector>
 #include "Eigen/Core"
-#include "ceres/random.h"
 #include "ceres/rotation.h"
 #include "glog/logging.h"
 
@@ -45,6 +44,25 @@
 typedef Eigen::Map<Eigen::VectorXd> VectorRef;
 typedef Eigen::Map<const Eigen::VectorXd> ConstVectorRef;
 
+inline double RandDouble() {
+  double r = static_cast<double>(rand());
+  return r / RAND_MAX;
+}
+
+// Box-Muller algorithm for normal random number generation.
+// http://en.wikipedia.org/wiki/Box-Muller_transform
+inline double RandNormal() {
+  double x1, x2, w;
+  do {
+    x1 = 2.0 * RandDouble() - 1.0;
+    x2 = 2.0 * RandDouble() - 1.0;
+    w = x1 * x1 + x2 * x2;
+  } while ( w >= 1.0 || w == 0.0 );
+
+  w = sqrt((-2.0 * log(w)) / w);
+  return x1 * w;
+}
+
 template<typename T>
 void FscanfOrDie(FILE* fptr, const char* format, T* value) {
   int num_scanned = fscanf(fptr, format, value);
diff --git a/examples/bundle_adjuster.cc b/examples/bundle_adjuster.cc
index 78dbd01..8fff9f0 100644
--- a/examples/bundle_adjuster.cc
+++ b/examples/bundle_adjuster.cc
@@ -60,7 +60,6 @@
 
 #include "bal_problem.h"
 #include "ceres/ceres.h"
-#include "ceres/random.h"
 #include "gflags/gflags.h"
 #include "glog/logging.h"
 #include "snavely_reprojection_error.h"
@@ -305,7 +304,7 @@
   BALProblem bal_problem(filename, FLAGS_use_quaternions);
   Problem problem;
 
-  SetRandomState(FLAGS_random_seed);
+  srand(FLAGS_random_seed);
   bal_problem.Normalize();
   bal_problem.Perturb(FLAGS_rotation_sigma,
                       FLAGS_translation_sigma,
diff --git a/examples/nist.cc b/examples/nist.cc
index 7504e51..ec8c56d 100644
--- a/examples/nist.cc
+++ b/examples/nist.cc
@@ -74,7 +74,6 @@
 #include <iostream>
 #include <fstream>
 #include "ceres/ceres.h"
-#include "ceres/split.h"
 #include "gflags/gflags.h"
 #include "glog/logging.h"
 #include "Eigen/Core"
@@ -95,16 +94,39 @@
             " nonmonotic steps");
 DEFINE_double(initial_trust_region_radius, 1e4, "Initial trust region radius");
 
+namespace ceres {
+namespace examples {
+
 using Eigen::Dynamic;
 using Eigen::RowMajor;
 typedef Eigen::Matrix<double, Dynamic, 1> Vector;
 typedef Eigen::Matrix<double, Dynamic, Dynamic, RowMajor> Matrix;
 
+void SplitStringUsingChar(const string& full,
+                          const char delim,
+                          vector<string>* result) {
+  back_insert_iterator< vector<string> > it(*result);
+
+  const char* p = full.data();
+  const char* end = p + full.size();
+  while (p != end) {
+    if (*p == delim) {
+      ++p;
+    } else {
+      const char* start = p;
+      while (++p != end && *p != delim) {
+        // Skip to the next occurence of the delimiter.
+      }
+      *it++ = string(start, p - start);
+    }
+  }
+}
+
 bool GetAndSplitLine(std::ifstream& ifs, std::vector<std::string>* pieces) {
   pieces->clear();
   char buf[256];
   ifs.getline(buf, 256);
-  ceres::SplitStringUsing(std::string(buf), " ", pieces);
+  SplitStringUsingChar(std::string(buf), ' ', pieces);
   return true;
 }
 
@@ -504,9 +526,12 @@
   std::cout << "Total   : " << easy_success + medium_success + hard_success << "/54\n";
 }
 
+}  // namespace examples
+}  // namespace ceres
+
 int main(int argc, char** argv) {
   google::ParseCommandLineFlags(&argc, &argv, true);
   google::InitGoogleLogging(argv[0]);
-  SolveNISTProblems();
+  ceres::examples::SolveNISTProblems();
   return 0;
 };