Provide Xoshiro256StarStar random
This commit is contained in:
parent
6c087a278d
commit
49f76c7bdd
@ -0,0 +1,110 @@
|
||||
package ru.dbotthepony.mc.otm.core.util
|
||||
|
||||
import it.unimi.dsi.fastutil.HashCommon
|
||||
import net.minecraft.util.Mth
|
||||
import net.minecraft.util.RandomSource
|
||||
import net.minecraft.world.level.levelgen.MarsagliaPolarGaussian
|
||||
import net.minecraft.world.level.levelgen.PositionalRandomFactory
|
||||
import java.lang.StringBuilder
|
||||
import java.util.random.RandomGenerator
|
||||
|
||||
class Xoshiro256SSRandom(
|
||||
private var s0: Long,
|
||||
private var s1: Long,
|
||||
private var s2: Long,
|
||||
private var s3: Long,
|
||||
) : RandomGenerator, RandomSource {
|
||||
private val gaussian = MarsagliaPolarGaussian(this)
|
||||
|
||||
constructor(seed: Long = System.nanoTime()) : this(1L, 2L, 3L, 4L) {
|
||||
setSeed(seed)
|
||||
}
|
||||
|
||||
override fun setSeed(seed: Long) {
|
||||
val rng = LCG64Random(seed)
|
||||
s0 = rng.nextLong()
|
||||
s1 = rng.nextLong()
|
||||
s2 = rng.nextLong()
|
||||
s3 = rng.nextLong()
|
||||
gaussian.reset()
|
||||
}
|
||||
|
||||
override fun nextInt(): Int {
|
||||
// sample upper bits
|
||||
return nextLong().ushr(32).toInt()
|
||||
}
|
||||
|
||||
override fun nextLong(): Long {
|
||||
val result = (s1 * 5).rotateLeft(7) * 9
|
||||
val t = s1.shl(17)
|
||||
s2 = s2.xor(s0)
|
||||
s3 = s3.xor(s1)
|
||||
s1 = s1.xor(s2)
|
||||
s0 = s0.xor(s3)
|
||||
s2 = s2.xor(t)
|
||||
s3 = s3.rotateLeft(45)
|
||||
return result
|
||||
}
|
||||
|
||||
override fun nextInt(bound: Int): Int {
|
||||
return super<RandomGenerator>.nextInt(bound)
|
||||
}
|
||||
|
||||
override fun nextInt(origin: Int, bound: Int): Int {
|
||||
return super<RandomGenerator>.nextInt(origin, bound)
|
||||
}
|
||||
|
||||
override fun nextBoolean(): Boolean {
|
||||
return super.nextBoolean()
|
||||
}
|
||||
|
||||
override fun nextFloat(): Float {
|
||||
return super.nextFloat()
|
||||
}
|
||||
|
||||
override fun nextDouble(): Double {
|
||||
return super.nextDouble()
|
||||
}
|
||||
|
||||
override fun nextGaussian(): Double {
|
||||
return gaussian.nextGaussian()
|
||||
}
|
||||
|
||||
override fun fork(): RandomSource {
|
||||
return Xoshiro256SSRandom(nextLong(), nextLong(), nextLong(), nextLong())
|
||||
}
|
||||
|
||||
override fun forkPositional(): PositionalRandomFactory {
|
||||
return Positional(nextLong(), nextLong(), nextLong(), nextLong())
|
||||
}
|
||||
|
||||
class Positional(
|
||||
val s0: Long,
|
||||
val s1: Long,
|
||||
val s2: Long,
|
||||
val s3: Long,
|
||||
) : PositionalRandomFactory {
|
||||
override fun at(x: Int, y: Int, z: Int): RandomSource {
|
||||
val rng = LCG64Random(Mth.getSeed(x, y, z))
|
||||
|
||||
return Xoshiro256SSRandom(
|
||||
s0.rotateLeft(11).xor(rng.nextLong()),
|
||||
s1.rotateLeft(22).xor(rng.nextLong()),
|
||||
s2.rotateLeft(33).xor(rng.nextLong()),
|
||||
s3.rotateLeft(44).xor(rng.nextLong()),
|
||||
)
|
||||
}
|
||||
|
||||
override fun fromHashOf(name: String): RandomSource {
|
||||
return Xoshiro256SSRandom(s0, HashCommon.murmurHash3(name.hashCode().toLong()).xor(s1), s2, s3)
|
||||
}
|
||||
|
||||
override fun fromSeed(seed: Long): RandomSource {
|
||||
return Xoshiro256SSRandom(seed)
|
||||
}
|
||||
|
||||
override fun parityConfigString(builder: StringBuilder) {
|
||||
throw UnsupportedOperationException()
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user