diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
index 8ce8671ac..396d3f04d 100644
--- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
+++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt
@@ -34,7 +34,7 @@ import ru.dbotthepony.mc.otm.datagen.items.MatteryItemModelProvider
 import ru.dbotthepony.mc.otm.datagen.lang.AddEnglishLanguage
 import ru.dbotthepony.mc.otm.datagen.models.MatteryBlockModelProvider
 import ru.dbotthepony.mc.otm.core.registryName
-import ru.dbotthepony.mc.otm.core.util.PCG32RandomSource
+import ru.dbotthepony.mc.otm.core.util.GJRAND64RandomSource
 import ru.dbotthepony.mc.otm.data.FlywheelMaterialDataProvider
 import ru.dbotthepony.mc.otm.datagen.advancements.addAdvancements
 import ru.dbotthepony.mc.otm.datagen.advancements.addAndroidAdvancements
@@ -71,7 +71,7 @@ object DataGen {
 
 	// for things which need to be random (e.g. UUIDs),
 	// so builds continue to be reproducible
-	val random = PCG32RandomSource(822393994030754753L)
+	val random = GJRAND64RandomSource(822393940230754753L, -2728812999467395658L)
 
 	var blockModelProvider: MatteryBlockModelProvider by WriteOnce()
 		private set
diff --git a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
index 30172b5cb..ac4d4e141 100644
--- a/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
+++ b/src/main/java/ru/dbotthepony/mc/otm/mixin/LevelMixin.java
@@ -5,11 +5,11 @@ import net.minecraft.world.level.Level;
 import org.jetbrains.annotations.NotNull;
 import org.spongepowered.asm.mixin.Mixin;
 import ru.dbotthepony.mc.otm.core.IMatteryLevel;
-import ru.dbotthepony.mc.otm.core.util.PCG32RandomSource;
+import ru.dbotthepony.mc.otm.core.util.GJRAND64RandomSource;
 
 @Mixin(Level.class)
 public abstract class LevelMixin implements IMatteryLevel {
-	public final RandomSource otm_random = new PCG32RandomSource();
+	public final RandomSource otm_random = new GJRAND64RandomSource();
 
 	@Override
 	public @NotNull RandomSource getOtmRandom() {
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt
index 5f49c00f4..7225eb4a8 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt
@@ -21,16 +21,16 @@ import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage
 import ru.dbotthepony.mc.otm.client.minecraft
 import ru.dbotthepony.mc.otm.core.collect.WeakHashSet
 import ru.dbotthepony.mc.otm.core.util.AtomicallyInvalidatedLazy
+import ru.dbotthepony.mc.otm.core.util.GJRAND64RandomSource
 import ru.dbotthepony.mc.otm.core.util.IConditionalTickable
 import ru.dbotthepony.mc.otm.core.util.ITickable
-import ru.dbotthepony.mc.otm.core.util.PCG32RandomSource
 import ru.dbotthepony.mc.otm.core.util.TickList
 import ru.dbotthepony.mc.otm.graph.GraphNodeList
 import java.lang.ref.Cleaner
 import java.util.*
 import java.util.concurrent.atomic.AtomicInteger
 
-private val threadLocalRandom = ThreadLocal.withInitial { PCG32RandomSource() }
+private val threadLocalRandom = ThreadLocal.withInitial { GJRAND64RandomSource() }
 internal val THREAD_LOCAL_RANDOM: RandomSource
 	get() = threadLocalRandom.get()
 
diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt
index 76098d215..9219a8248 100644
--- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt
+++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt
@@ -44,7 +44,6 @@ import ru.dbotthepony.mc.otm.core.math.set
 import ru.dbotthepony.mc.otm.core.math.writeDecimal
 import ru.dbotthepony.mc.otm.core.nbt.set
 import ru.dbotthepony.mc.otm.core.nextUUID
-import ru.dbotthepony.mc.otm.core.util.PCG32RandomSource
 import ru.dbotthepony.mc.otm.core.util.formatPower
 import ru.dbotthepony.mc.otm.isClientThread
 import ru.dbotthepony.mc.otm.isServerThread