Cosmos/source/Cosmos.System2_Plugs/System/RandomImpl.cs

63 lines
No EOL
1.6 KiB
C#

using System;
using Cosmos.IL2CPU.API.Attribs;
using Cosmos.HAL;
namespace Cosmos.System_Plugs.System
{
[Plug(Target = typeof(Random))]
public class RandomImpl
{
public static void Ctor(Random aThis)
{
//empty
}
public static void Ctor(Random aThis, int seed)
{
//empty ATM
}
public static int Next(Random aThis, int maxValue)
{
return (int)(GetUniform() * maxValue);
}
public static int Next(Random aThis)
{
return (int)(GetUniform() * int.MaxValue);
}
public static int Next(Random aThis, int minValue, int maxValue)
{
uint diff = (uint)(maxValue - minValue);
if (diff <= 1)
return minValue;
return (int)((uint)(GetUniform() * diff) + minValue);
}
public static void NextBytes(Random aThis, byte[] buffer)
{
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = (byte)(GetUniform() * (byte.MaxValue + 1));
}
}
public static double NextDouble(Random aThis)
{
return GetUniform();
}
static double GetUniform()
{
uint seed = (uint)RTC.Second;
uint m_w = (uint)(seed >> 16);
uint m_z = (uint)(seed % 4294967296);
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
uint u = (m_z << 16) + m_w;
double uniform = (u + 1.0) * 2.328306435454494e-10;
return uniform;
}
}
}