diff --git a/RayTracer/tools/Random.cpp b/RayTracer/tools/Random.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..6e685859dbd690671e7132e8be3143acb66810ac
--- /dev/null
+++ b/RayTracer/tools/Random.cpp
@@ -0,0 +1,20 @@
+#include "Random.h"
+
+namespace util {
+
+Vec3 rand_vec3() {
+	return Vec3(dis(gen), dis(gen), dis(gen));
+}
+
+bool in_circle(const Vec3& v) {
+	return v.length() <= 1;
+}
+
+Vec3 rand_vec3_in_circle(float r) {
+	Vec3 result;
+	do {
+		result = rand_vec3();
+	} while (!in_circle(result));
+	return result * r;
+}
+}  // namespace util
\ No newline at end of file
diff --git a/RayTracer/tools/Random.h b/RayTracer/tools/Random.h
new file mode 100644
index 0000000000000000000000000000000000000000..dfc8b4fc4602dce76a28fca8bfee33d79d237e27
--- /dev/null
+++ b/RayTracer/tools/Random.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#include <random>
+
+#include "Vec3.h"
+
+namespace util {
+
+static std::random_device rd;
+static std::mt19937 gen(rd());
+static std::uniform_real_distribution<> dis(-1.0, 1.0);
+Vec3 rand_vec3();
+bool in_circle(const Vec3& v);
+Vec3 rand_vec3_in_circle(float r);
+}  // namespace util