From 0a05d766d465617b2a95a2c78bc0bed9561eecae Mon Sep 17 00:00:00 2001 From: wmltogether Date: Wed, 15 Jan 2025 17:41:56 +0800 Subject: [PATCH 1/3] Fix the result of math.random is inconsistent with Lua standard library. --- src/Lua/Standard/MathematicsLibrary.cs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/Lua/Standard/MathematicsLibrary.cs b/src/Lua/Standard/MathematicsLibrary.cs index d72e453a..54a24c07 100644 --- a/src/Lua/Standard/MathematicsLibrary.cs +++ b/src/Lua/Standard/MathematicsLibrary.cs @@ -224,23 +224,34 @@ public ValueTask Rad(LuaFunctionExecutionContext context, Memory public ValueTask Random(LuaFunctionExecutionContext context, Memory buffer, CancellationToken cancellationToken) { var rand = context.State.Environment[RandomInstanceKey].Read().Random; - + // When we call it without arguments, it returns a pseudo-random real number with uniform distribution in the interval [0,1 if (context.ArgumentCount == 0) { buffer.Span[0] = rand.NextDouble(); } + // When we call it with only one argument, an integer n, it returns an integer pseudo-random number. + // This is different from the C# random functions. + // See: https://www.lua.org/pil/18.html else if (context.ArgumentCount == 1) { - var arg0 = context.GetArgument(0); - buffer.Span[0] = rand.NextDouble() * (arg0 - 1) + 1; + var arg0 = context.GetArgument(0); + if (arg0 < 0) + { + LuaRuntimeException.BadArgument(context.State.GetTraceback(), 0, "random"); + } + buffer.Span[0] = rand.Next(arg0 + 1); } + // Finally, we can call random with two integer arguments, l and u, to get a pseudo-random integer x such that l <= x <= u. else { - var arg0 = context.GetArgument(0); - var arg1 = context.GetArgument(1); - buffer.Span[0] = rand.NextDouble() * (arg1 - arg0) + arg0; + var arg0 = context.GetArgument(0); + var arg1 = context.GetArgument(1); + if (arg1 <= arg0) + { + LuaRuntimeException.BadArgument(context.State.GetTraceback(), 1, "random"); + } + buffer.Span[0] = rand.Next(arg0, arg1 + 1); } - return new(1); } From 6f2391b2590321ef546a3f8538096fb1e9e0f5d9 Mon Sep 17 00:00:00 2001 From: wmltogether Date: Thu, 16 Jan 2025 17:35:44 +0800 Subject: [PATCH 2/3] Fix random input with only one argument. --- src/Lua/Standard/MathematicsLibrary.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Lua/Standard/MathematicsLibrary.cs b/src/Lua/Standard/MathematicsLibrary.cs index 54a24c07..c01b8325 100644 --- a/src/Lua/Standard/MathematicsLibrary.cs +++ b/src/Lua/Standard/MathematicsLibrary.cs @@ -229,7 +229,7 @@ public ValueTask Random(LuaFunctionExecutionContext context, Memory Random(LuaFunctionExecutionContext context, Memory Date: Thu, 16 Jan 2025 17:37:31 +0800 Subject: [PATCH 3/3] Fix random with two arguments MUST >= 1. --- src/Lua/Standard/MathematicsLibrary.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Lua/Standard/MathematicsLibrary.cs b/src/Lua/Standard/MathematicsLibrary.cs index c01b8325..7eb16567 100644 --- a/src/Lua/Standard/MathematicsLibrary.cs +++ b/src/Lua/Standard/MathematicsLibrary.cs @@ -246,7 +246,7 @@ public ValueTask Random(LuaFunctionExecutionContext context, Memory(0); var arg1 = context.GetArgument(1); - if (arg1 <= arg0) + if (arg0 < 1 || arg1 <= arg0) { LuaRuntimeException.BadArgument(context.State.GetTraceback(), 1, "random"); }