SplitMix64.cs 920 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. namespace Content.Shared._RMC14.Random;
  2. /// <summary>
  3. /// Seed initializer PRNG (splitmix64).
  4. /// </summary>
  5. /// <remarks>http://prng.di.unimi.it/splitmix64.c</remarks>
  6. public record struct SplitMix64
  7. {
  8. /// <summary>
  9. /// Creates a new instance.
  10. /// </summary>
  11. public SplitMix64()
  12. : this(DateTime.UtcNow.Ticks)
  13. {
  14. }
  15. /// <summary>
  16. /// Creates a new instance.
  17. /// </summary>
  18. /// <param name="seed">Seed value.</param>
  19. public SplitMix64(long seed)
  20. {
  21. x = (UInt64) seed;
  22. }
  23. private UInt64 x;
  24. /// <summary>
  25. /// Returns the next 64-bit pseudo-random number.
  26. /// </summary>
  27. public long Next()
  28. {
  29. UInt64 z = unchecked(x += 0x9e3779b97f4a7c15);
  30. z = unchecked((z ^ (z >> 30)) * 0xbf58476d1ce4e5b9);
  31. z = unchecked((z ^ (z >> 27)) * 0x94d049bb133111eb);
  32. return unchecked((Int64) (z ^ (z >> 31)));
  33. }
  34. }