From b8291c7e1c060f4995e005ec769e5905e3703c31 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Wed, 5 Mar 2025 09:34:14 +0700 Subject: [PATCH] Proper Xoshiro256 initialization with 256 bit seed --- .../mc/otm/core/util/Xoshiro256SSRandom.kt | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Xoshiro256SSRandom.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Xoshiro256SSRandom.kt index 8f368e7e6..492db9761 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Xoshiro256SSRandom.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/Xoshiro256SSRandom.kt @@ -9,11 +9,12 @@ import net.minecraft.world.level.levelgen.RandomSupport import java.lang.StringBuilder import java.util.random.RandomGenerator -class Xoshiro256SSRandom( +class Xoshiro256SSRandom private constructor( private var s0: Long, private var s1: Long, private var s2: Long, private var s3: Long, + marker: Nothing? ) : RandomGenerator, RandomSource { private val gaussian = MarsagliaPolarGaussian(this) @@ -26,11 +27,17 @@ class Xoshiro256SSRandom( ) { "Xoshiro can't operate with seed being entirely zero" } } - constructor(seed: Long) : this(1L, 2L, 3L, 4L) { + constructor(s0: Long, s1: Long, s2: Long, s3: Long) : this(s0, s1, s2, s3, null) { + // discard some values so generator can get going if provided seed was "weak" + for (i in 0 until 32) + nextLong() + } + + constructor(seed: Long) : this(1L, 2L, 3L, 4L, null) { setSeed(seed) } - constructor() : this(RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed()) + constructor() : this(RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), RandomSupport.generateUniqueSeed(), null) override fun setSeed(seed: Long) { val rng = LCG64Random(seed)