Proper Xoshiro256 initialization with 256 bit seed

This commit is contained in:
DBotThePony 2025-03-05 09:34:14 +07:00
parent 1a52864c4e
commit b8291c7e1c
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -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)