diff --git a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
index 346a09cac8..ab61b14ac4 100644
--- a/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
+++ b/osu.Game.Rulesets.Catch/Beatmaps/CatchBeatmapProcessor.cs
@@ -5,10 +5,10 @@ using System;
using System.Collections.Generic;
using System.Linq;
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Catch.MathUtils;
using osu.Game.Rulesets.Catch.Objects;
using osu.Game.Rulesets.Catch.UI;
using osu.Game.Rulesets.Objects.Types;
+using osu.Game.Utils;
namespace osu.Game.Rulesets.Catch.Beatmaps
{
@@ -46,7 +46,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
public void ApplyPositionOffsets(IBeatmap beatmap)
{
- var rng = new FastRandom(RNG_SEED);
+ var rng = new LegacyRandom(RNG_SEED);
float? lastPosition = null;
double lastStartTime = 0;
@@ -98,7 +98,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
initialiseHyperDash(beatmap);
}
- private static void applyHardRockOffset(CatchHitObject hitObject, ref float? lastPosition, ref double lastStartTime, FastRandom rng)
+ private static void applyHardRockOffset(CatchHitObject hitObject, ref float? lastPosition, ref double lastStartTime, LegacyRandom rng)
{
float offsetPosition = hitObject.OriginalX;
double startTime = hitObject.StartTime;
@@ -146,7 +146,7 @@ namespace osu.Game.Rulesets.Catch.Beatmaps
/// The position which the offset should be applied to.
/// The maximum offset, cannot exceed 20px.
/// The random number generator.
- private static void applyRandomOffset(ref float position, double maxOffset, FastRandom rng)
+ private static void applyRandomOffset(ref float position, double maxOffset, LegacyRandom rng)
{
bool right = rng.NextBool();
float rand = Math.Min(20, (float)rng.Next(0, Math.Max(0, maxOffset)));
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs
index 47e0e6d7b1..207c6907c8 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs
@@ -11,8 +11,8 @@ using osu.Game.Beatmaps;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Rulesets.Mania.Beatmaps.Patterns;
-using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy;
+using osu.Game.Utils;
using osuTK;
namespace osu.Game.Rulesets.Mania.Beatmaps
@@ -31,7 +31,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
private readonly int originalTargetColumns;
// Internal for testing purposes
- internal FastRandom Random { get; private set; }
+ internal LegacyRandom Random { get; private set; }
private Pattern lastPattern = new Pattern();
@@ -84,7 +84,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
IBeatmapDifficultyInfo difficulty = original.Difficulty;
int seed = (int)MathF.Round(difficulty.DrainRate + difficulty.CircleSize) * 20 + (int)(difficulty.OverallDifficulty * 41.2) + (int)MathF.Round(difficulty.ApproachRate);
- Random = new FastRandom(seed);
+ Random = new LegacyRandom(seed);
return base.ConvertBeatmap(original, cancellationToken);
}
@@ -227,7 +227,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps
///
private class SpecificBeatmapPatternGenerator : Patterns.Legacy.PatternGenerator
{
- public SpecificBeatmapPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
+ public SpecificBeatmapPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
{
}
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
index 5f8b58d94d..dafe65f415 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs
@@ -8,12 +8,12 @@ using System.Linq;
using osu.Framework.Extensions.EnumExtensions;
using osu.Game.Audio;
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Beatmaps.ControlPoints;
using osu.Game.Beatmaps.Formats;
+using osu.Game.Utils;
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
@@ -34,7 +34,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
private PatternType convertType;
- public DistanceObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
+ public DistanceObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
{
convertType = PatternType.None;
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs
index f816a70ab3..2265d3d347 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs
@@ -2,13 +2,13 @@
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
-using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using System.Linq;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Rulesets.Mania.Objects;
+using osu.Game.Utils;
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
@@ -17,7 +17,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
private readonly int endTime;
private readonly PatternType convertType;
- public EndTimeObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
+ public EndTimeObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
{
endTime = (int)((HitObject as IHasDuration)?.EndTime ?? 0);
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs
index 53b059b4e2..41d4c9322b 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs
@@ -9,11 +9,11 @@ using osuTK;
using osu.Game.Audio;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.ControlPoints;
-using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Mania.Objects;
using osu.Game.Rulesets.Objects;
using osu.Game.Rulesets.Objects.Types;
using osu.Framework.Extensions.IEnumerableExtensions;
+using osu.Game.Utils;
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
@@ -23,7 +23,7 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
private readonly PatternType convertType;
- public HitObjectPatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, double previousTime, Vector2 previousPosition, double density,
+ public HitObjectPatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, double previousTime, Vector2 previousPosition, double density,
PatternType lastStair, IBeatmap originalBeatmap)
: base(random, hitObject, beatmap, previousPattern, originalBeatmap)
{
diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
index eaf0ea0f2b..d5689c047a 100644
--- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
+++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/PatternGenerator.cs
@@ -5,8 +5,8 @@ using System;
using System.Linq;
using JetBrains.Annotations;
using osu.Game.Beatmaps;
-using osu.Game.Rulesets.Mania.MathUtils;
using osu.Game.Rulesets.Objects;
+using osu.Game.Utils;
namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
{
@@ -23,14 +23,14 @@ namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy
///
/// The random number generator to use.
///
- protected readonly FastRandom Random;
+ protected readonly LegacyRandom Random;
///
/// The beatmap which is being converted from.
///
protected readonly IBeatmap OriginalBeatmap;
- protected PatternGenerator(FastRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
+ protected PatternGenerator(LegacyRandom random, HitObject hitObject, ManiaBeatmap beatmap, Pattern previousPattern, IBeatmap originalBeatmap)
: base(hitObject, beatmap, previousPattern)
{
if (random == null) throw new ArgumentNullException(nameof(random));
diff --git a/osu.Game.Rulesets.Mania/MathUtils/FastRandom.cs b/osu.Game.Rulesets.Mania/MathUtils/FastRandom.cs
deleted file mode 100644
index a9cd7f2476..0000000000
--- a/osu.Game.Rulesets.Mania/MathUtils/FastRandom.cs
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
-// See the LICENCE file in the repository root for full licence text.
-
-using System;
-
-namespace osu.Game.Rulesets.Mania.MathUtils
-{
- ///
- /// A PRNG specified in http://heliosphan.org/fastrandom.html.
- ///
- internal class FastRandom
- {
- private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
- private const uint int_mask = 0x7FFFFFFF;
- private const uint y = 842502087;
- private const uint z = 3579807591;
- private const uint w = 273326509;
-
- internal uint X { get; private set; }
- internal uint Y { get; private set; } = y;
- internal uint Z { get; private set; } = z;
- internal uint W { get; private set; } = w;
-
- public FastRandom(int seed)
- {
- X = (uint)seed;
- }
-
- public FastRandom()
- : this(Environment.TickCount)
- {
- }
-
- ///
- /// Generates a random unsigned integer within the range [, ).
- ///
- /// The random value.
- public uint NextUInt()
- {
- uint t = X ^ (X << 11);
- X = Y;
- Y = Z;
- Z = W;
- return W = W ^ (W >> 19) ^ t ^ (t >> 8);
- }
-
- ///
- /// Generates a random integer value within the range [0, ).
- ///
- /// The random value.
- public int Next() => (int)(int_mask & NextUInt());
-
- ///
- /// Generates a random integer value within the range [0, ).
- ///
- /// The upper bound.
- /// The random value.
- public int Next(int upperBound) => (int)(NextDouble() * upperBound);
-
- ///
- /// Generates a random integer value within the range [, ).
- ///
- /// The lower bound of the range.
- /// The upper bound of the range.
- /// The random value.
- public int Next(int lowerBound, int upperBound) => (int)(lowerBound + NextDouble() * (upperBound - lowerBound));
-
- ///
- /// Generates a random double value within the range [0, 1).
- ///
- /// The random value.
- public double NextDouble() => int_to_real * Next();
-
- private uint bitBuffer;
- private int bitIndex = 32;
-
- ///
- /// Generates a reandom boolean value. Cached such that a random value is only generated once in every 32 calls.
- ///
- /// The random value.
- public bool NextBool()
- {
- if (bitIndex == 32)
- {
- bitBuffer = NextUInt();
- bitIndex = 1;
-
- return (bitBuffer & 1) == 1;
- }
-
- bitIndex++;
- return ((bitBuffer >>= 1) & 1) == 1;
- }
- }
-}
diff --git a/osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs b/osu.Game/Utils/LegacyRandom.cs
similarity index 79%
rename from osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs
rename to osu.Game/Utils/LegacyRandom.cs
index 46e427e1b7..cf731aa91f 100644
--- a/osu.Game.Rulesets.Catch/MathUtils/FastRandom.cs
+++ b/osu.Game/Utils/LegacyRandom.cs
@@ -2,27 +2,36 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using osu.Framework.Utils;
-namespace osu.Game.Rulesets.Catch.MathUtils
+namespace osu.Game.Utils
{
///
/// A PRNG specified in http://heliosphan.org/fastrandom.html.
+ /// Should only be used to match legacy behaviour. See for a newer alternative.
///
- public class FastRandom
+ ///
+ /// Known in osu-stable code as `FastRandom`.
+ ///
+ public class LegacyRandom
{
private const double int_to_real = 1.0 / (int.MaxValue + 1.0);
private const uint int_mask = 0x7FFFFFFF;
- private const uint y_initial = 842502087;
- private const uint z_initial = 3579807591;
- private const uint w_initial = 273326509;
- private uint x, y = y_initial, z = z_initial, w = w_initial;
+ private const uint y = 842502087;
+ private const uint z = 3579807591;
+ private const uint w = 273326509;
- public FastRandom(int seed)
+ public uint X { get; private set; }
+ public uint Y { get; private set; } = y;
+ public uint Z { get; private set; } = z;
+ public uint W { get; private set; } = w;
+
+ public LegacyRandom(int seed)
{
- x = (uint)seed;
+ X = (uint)seed;
}
- public FastRandom()
+ public LegacyRandom()
: this(Environment.TickCount)
{
}
@@ -33,11 +42,11 @@ namespace osu.Game.Rulesets.Catch.MathUtils
/// The random value.
public uint NextUInt()
{
- uint t = x ^ (x << 11);
- x = y;
- y = z;
- z = w;
- return w = w ^ (w >> 19) ^ t ^ (t >> 8);
+ uint t = X ^ (X << 11);
+ X = Y;
+ Y = Z;
+ Z = W;
+ return W = W ^ (W >> 19) ^ t ^ (t >> 8);
}
///