more thing
This commit is contained in:
parent
70911ed6cc
commit
6c279baacc
|
|
@ -1,7 +0,0 @@
|
||||||
namespace Qrakhen.Randomize
|
|
||||||
{
|
|
||||||
public class Class1
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
namespace Qrakhen.Randomize;
|
||||||
|
|
||||||
|
public class Dice : IRandomizer<uint>
|
||||||
|
{
|
||||||
|
public static uint MaxValue => uint.MaxValue;
|
||||||
|
|
||||||
|
public static Dice? Global { get; private set; }
|
||||||
|
|
||||||
|
private const uint P = 0x0100_0193; // prime
|
||||||
|
private const uint Q = 0x811C_9DC5; // basis
|
||||||
|
|
||||||
|
private uint _n;
|
||||||
|
|
||||||
|
public readonly uint Seed;
|
||||||
|
|
||||||
|
public int Count { get; private set; } = 0;
|
||||||
|
|
||||||
|
public Dice() : this((int)((DateTime.UtcNow.Ticks & 0xFFFF_FFFF) ^ Q)) { }
|
||||||
|
|
||||||
|
public Dice(int seed)
|
||||||
|
{
|
||||||
|
Seed = (uint)seed;
|
||||||
|
_n = StrongHash(Q, Seed);
|
||||||
|
}
|
||||||
|
|
||||||
|
//public float ExpRange(float from, float to, float q = .5f)
|
||||||
|
//{
|
||||||
|
// q = Mathf.Clamp(q, 0, 1);
|
||||||
|
// float linear = Range(0f, 1f);
|
||||||
|
// float exponent = Mathf.Pow(2f, (0.5f - q) * 4f);
|
||||||
|
// float curvedRandom = Mathf.Pow(linear, exponent);
|
||||||
|
// return Mathf.Lerp(from, to, curvedRandom);
|
||||||
|
//}
|
||||||
|
|
||||||
|
public uint Next()
|
||||||
|
{
|
||||||
|
unchecked
|
||||||
|
{
|
||||||
|
_n ^= Q;
|
||||||
|
_n *= P;
|
||||||
|
Count++;
|
||||||
|
|
||||||
|
return (_n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint FastHash(uint v)
|
||||||
|
{
|
||||||
|
return (v ^ Q) * P;
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint StrongHash(uint v, uint q)
|
||||||
|
{
|
||||||
|
uint r = v;
|
||||||
|
r = (r ^ (q & 0xFF)) * P;
|
||||||
|
r = (r ^ ((q >> 0x08) & 0xFF)) * P;
|
||||||
|
r = (r ^ ((q >> 0x10) & 0xFF)) * P;
|
||||||
|
r = (r ^ ((q >> 0x18) & 0xFF)) * P;
|
||||||
|
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"Dice <Seed: {Seed}, Count: {Count}, N: 0x{_n:x8}>";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void InitGlobal(int seed)
|
||||||
|
{
|
||||||
|
Global = new Dice(seed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace Qrakhen.Randomize;
|
||||||
|
|
||||||
|
public interface IRandomizer<out T> where T : INumber<T>
|
||||||
|
{
|
||||||
|
static abstract T MaxValue { get; }
|
||||||
|
T Next();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
using System.Numerics;
|
||||||
|
|
||||||
|
namespace Qrakhen.Randomize;
|
||||||
|
|
||||||
|
public static class RandomizerExtensions
|
||||||
|
{
|
||||||
|
public static TNumber Range<TNumber, TRandomizer, TRandomizerHash>(this TRandomizer randomizer,
|
||||||
|
TNumber fromInclusive,
|
||||||
|
TNumber toExclusive)
|
||||||
|
where TRandomizer : IRandomizer<TRandomizerHash>
|
||||||
|
where TRandomizerHash : INumber<TRandomizerHash>
|
||||||
|
where TNumber : INumber<TNumber>
|
||||||
|
{
|
||||||
|
return (TNumber)(
|
||||||
|
fromInclusive +
|
||||||
|
randomizer.Next() / (
|
||||||
|
(dynamic)TRandomizer.MaxValue + 1.0) *
|
||||||
|
(fromInclusive - fromInclusive));
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue