diff --git a/inc/canvas/BackGround.hpp b/inc/canvas/BackGround.hpp
index 1631660..321754e 100644
--- a/inc/canvas/BackGround.hpp
+++ b/inc/canvas/BackGround.hpp
@@ -1,39 +1,33 @@
 #include <vector>
 
 #include "canvas/Sun.hpp"
+#include "values/Dna.hpp"
 
 #include <raylib.h>
 
-struct Moon
-{
-  float x;
-  float y;
-  float size;
-};
-
 class BackGround
 {
 
 public:
   BackGround() = default;
   ~BackGround() = default;
-  void init(int size);
+  void init(int canvasSize);
   void deinit();
-  void newGen();
-  void draw();
+  void draw(Dna *dna);
 
 private:
   void drawStars();
   void drawSun();
   void drawMounten(size_t mountenSegments, int min, int max, Color color);
 
+  Dna *m_dna;
+
+  uint128 mountenSeed;
+  uint128 starSeed;
+
   Sun sun;
 
-  Moon m_moon;
-  int colorSet;
-  int time;
-
-  int size = 0;
+  int canvasSize = 0;
 
   constexpr static size_t numOfStarts = 150;
   constexpr static float moonXOffset = 0.1f;
diff --git a/inc/values/Dna.hpp b/inc/values/Dna.hpp
new file mode 100644
index 0000000..1df8cc3
--- /dev/null
+++ b/inc/values/Dna.hpp
@@ -0,0 +1,27 @@
+#include <cinttypes>
+
+struct uint128
+{
+  uint32_t a;
+  uint32_t b;
+  uint32_t c;
+  uint32_t d;
+};
+
+struct Moon
+{
+  float x;
+  float y;
+  float size;
+};
+
+struct Dna
+{
+  Moon moon;
+  int colorSet;
+  int time;
+  uint128 mountenSeed;
+  uint128 starSeed;
+};
+
+Dna newDna();
diff --git a/inc/values/mrand.hpp b/inc/values/mrand.hpp
index d8354b0..d6aabdc 100644
--- a/inc/values/mrand.hpp
+++ b/inc/values/mrand.hpp
@@ -1,8 +1,13 @@
 #include <inttypes.h>
 
+struct uint128;
+
 namespace mrand
 {
   void setSeed(unsigned long long seed);
   int getValue(int min, int max);
+  float getFloat(uint128 *state);
   float getFloat();
+  int getValue(int min, int max, uint128 *state);
+  uint32_t getInt();
 }
\ No newline at end of file
diff --git a/src/canvas/BackGround.cpp b/src/canvas/BackGround.cpp
index 979de26..0c38c45 100644
--- a/src/canvas/BackGround.cpp
+++ b/src/canvas/BackGround.cpp
@@ -10,9 +10,9 @@
 #include <raymath.h>
 
 // Public
-void BackGround::init(int size)
+void BackGround::init(int canvasSize)
 {
-  this->size = size;
+  this->canvasSize = canvasSize;
   sun.init();
 }
 
@@ -21,34 +21,28 @@ void BackGround::deinit()
   sun.deinit();
 }
 
-void BackGround::newGen()
+void BackGround::draw(Dna *dna)
 {
+  m_dna = dna;
+  mountenSeed = dna->mountenSeed;
+  starSeed = dna->starSeed;
 
-  m_moon = {mrand::getFloat(), mrand::getFloat(), mrand::getFloat()};
-  colorSet = mrand::getValue(0, 3);
-  time = floor(Remap(m_moon.y, 0, 1, 4, 0));
+  BackGroundColors::setColor(m_dna->colorSet, m_dna->time);
 
-  BackGroundColors::setColor(colorSet, time);
-
-  draw();
-}
-
-void BackGround::draw()
-{
-  if (colorSet == 3)
+  if (m_dna->colorSet == 3)
   {
     ClearBackground(BackGroundColors::backGroundColor);
     drawStars();
   }
   else
   {
-    DrawRectangleGradientV(0, 0, size, size, ColorAdd(BackGroundColors::backGroundColor, 60), BackGroundColors::backGroundColor);
+    DrawRectangleGradientV(0, 0, canvasSize, canvasSize, ColorAdd(BackGroundColors::backGroundColor, 60), BackGroundColors::backGroundColor);
   }
 
   drawSun();
-  drawMounten(20, (int)(mounten1min * size), (int)(mounten1max * size), BackGroundColors::MountenColor1);
-  drawMounten(21, (int)(mounten2min * size), (int)(mounten2max * size), BackGroundColors::MountenColor2);
-  drawMounten(23, (int)(mounten3min * size), (int)(mounten3max * size), BackGroundColors::MountenColor3);
+  drawMounten(20, (int)(mounten1min * canvasSize), (int)(mounten1max * canvasSize), BackGroundColors::MountenColor1);
+  drawMounten(21, (int)(mounten2min * canvasSize), (int)(mounten2max * canvasSize), BackGroundColors::MountenColor2);
+  drawMounten(23, (int)(mounten3min * canvasSize), (int)(mounten3max * canvasSize), BackGroundColors::MountenColor3);
 }
 
 void BackGround::drawStars()
@@ -60,10 +54,10 @@ void BackGround::drawStars()
 
   for (size_t i = 0; i < numOfStarts; i++)
   {
-    int x = mrand::getFloat() * size;
-    int y = mrand::getFloat() * size;
-    int weight = mrand::getFloat() * 3 + 1;
-    float alph = Normalize(mrand::getFloat(), 0.04f, 0.8f);
+    int x = mrand::getFloat(&starSeed) * canvasSize;
+    int y = mrand::getFloat(&starSeed) * canvasSize;
+    int weight = mrand::getFloat(&starSeed) * 3 + 1;
+    float alph = Normalize(mrand::getFloat(&starSeed), 0.04f, 0.8f);
     Color color = ColorLerp(BackGroundColors::backGroundColor, BackGroundColors::starColor, alph);
 
     rlColor4ub(color.r, color.g, color.b, color.a);
@@ -93,21 +87,21 @@ void BackGround::drawStars()
 
 void BackGround::drawSun()
 {
-  int r = ((m_moon.y * (maxSizeOfMoon - minSizeOfMoon)) + minSizeOfMoon) * size;
-  int xpos = Lerp(size * moonXOffset, size - size * moonXOffset, m_moon.x);
-  int ypos = Lerp(size * moonXOffset, maxYPosOfMoon * size, m_moon.y);
+  int r = ((m_dna->moon.y * (maxSizeOfMoon - minSizeOfMoon)) + minSizeOfMoon) * canvasSize;
+  int xpos = Lerp(canvasSize * moonXOffset, canvasSize - canvasSize * moonXOffset, m_dna->moon.x);
+  int ypos = Lerp(canvasSize * moonXOffset, maxYPosOfMoon * canvasSize, m_dna->moon.y);
 
-  if (colorSet == 3)
+  if (m_dna->colorSet == 3)
   {
     sun.setColor(BackGroundColors::moonColor);
-    r = ((m_moon.size * (maxSizeOfMoon - minSizeOfMoon)) + minSizeOfMoon) * size;
+    r = ((m_dna->moon.size * (maxSizeOfMoon - minSizeOfMoon)) + minSizeOfMoon) * canvasSize;
   }
   else
   {
     Color color = {0};
     color.r = 255;
-    color.g = std::lerp(200, 50, m_moon.y);
-    color.b = std::lerp(50, 0, m_moon.y);
+    color.g = std::lerp(200, 50, m_dna->moon.y);
+    color.b = std::lerp(50, 0, m_dna->moon.y);
     color.a = 255;
 
     sun.setColor(color);
@@ -118,9 +112,9 @@ void BackGround::drawSun()
 void BackGround::drawMounten(size_t mountenSegments, int min, int max, Color color)
 {
   int x = 0;
-  int diff = size / (mountenSegments - 1);
+  int diff = canvasSize / (mountenSegments - 1);
 
-  float p = mrand::getFloat();
+  float p = mrand::getFloat(&mountenSeed);
 
   int y = Lerp(min, max, p);
   rlSetTexture(1);
@@ -133,20 +127,20 @@ void BackGround::drawMounten(size_t mountenSegments, int min, int max, Color col
     // topLeft
     rlVertex2f(x, y);
     // bottomLeft
-    rlVertex2f(x, size);
+    rlVertex2f(x, canvasSize);
 
-    p = mrand::getFloat();
+    p = mrand::getFloat(&mountenSeed);
     y = Lerp(min, max, p);
     x += diff;
     // topRight
     rlVertex2f(x, y);
 
     // bottomRight
-    rlVertex2f(x, size);
+    rlVertex2f(x, canvasSize);
     // topRight
     rlVertex2f(x, y);
 
-    rlVertex2f(x - diff, size);
+    rlVertex2f(x - diff, canvasSize);
   }
   rlEnd();
   rlSetTexture(0);
diff --git a/src/canvas/Canvas.cpp b/src/canvas/Canvas.cpp
index a2ce14d..93384df 100644
--- a/src/canvas/Canvas.cpp
+++ b/src/canvas/Canvas.cpp
@@ -11,7 +11,9 @@ void Canvas::newGen(RenderTexture2D &target)
   BeginTextureMode(target);
   ClearBackground(WHITE);
 
-  backGround.newGen();
+  Dna dna = newDna();
+
+  backGround.draw(&dna);
   tree.newGen();
 
   EndTextureMode();
diff --git a/src/values/Dna.cpp b/src/values/Dna.cpp
new file mode 100644
index 0000000..e0ce89c
--- /dev/null
+++ b/src/values/Dna.cpp
@@ -0,0 +1,25 @@
+
+
+#include "values/Dna.hpp"
+#include "values/mrand.hpp"
+
+#include <raymath.h>
+
+Dna newDna()
+{
+  Dna dna = {0};
+  dna.moon = {mrand::getFloat(), mrand::getFloat(), mrand::getFloat()};
+  dna.colorSet = mrand::getValue(0, 3);
+  dna.time = std::floor(Remap(mrand::getFloat(), 0, 1, 4, 0));
+
+  dna.mountenSeed.a = mrand::getInt();
+  dna.mountenSeed.b = mrand::getInt();
+  dna.mountenSeed.c = mrand::getInt();
+  dna.mountenSeed.d = mrand::getInt();
+  dna.starSeed.a = mrand::getInt();
+  dna.starSeed.b = mrand::getInt();
+  dna.starSeed.c = mrand::getInt();
+  dna.starSeed.d = mrand::getInt();
+
+  return dna;
+}
\ No newline at end of file
diff --git a/src/values/mrand.cpp b/src/values/mrand.cpp
index 9aaf25f..4b2c4b0 100644
--- a/src/values/mrand.cpp
+++ b/src/values/mrand.cpp
@@ -48,6 +48,11 @@ namespace mrand
     rprand_state[3] = (uint32_t)((rprand_splitmix64(rprand_seed) & 0xffffffff00000000) >> 32);
   }
 
+  uint32_t getInt()
+  {
+    return my_rprand_xoshiro(rprand_state);
+  }
+
   int getValue(int min, int max)
   {
     int value = my_rprand_xoshiro(rprand_state) % (std::abs(max - min) + 1) + min;
@@ -60,15 +65,15 @@ namespace mrand
     return my_rprand_xoshiro(rprand_state) / 4294967295.0f;
   }
 
-  int getValue(int min, int max, uint32_t state[4])
+  int getValue(int min, int max, uint128 *state)
   {
-    int value = my_rprand_xoshiro(state) % (std::abs(max - min) + 1) + min;
+    int value = my_rprand_xoshiro((uint32_t *)state) % (std::abs(max - min) + 1) + min;
 
     return value;
   }
 
-  float getFloat(uint32_t state[4])
+  float getFloat(uint128 *state)
   {
-    return my_rprand_xoshiro(state) / 4294967295.0f;
+    return my_rprand_xoshiro((uint32_t *)state) / 4294967295.0f;
   }
 }
\ No newline at end of file