|
using System; |
|
using System.IO; |
|
|
|
namespace RandomTest |
|
{ |
|
class Program |
|
{ |
|
private static readonly string BasePath = |
|
Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "random-files"); |
|
|
|
static void Main(string[] args) |
|
{ |
|
if (!Directory.Exists(BasePath)) |
|
Directory.CreateDirectory(BasePath); |
|
|
|
const int runs = 10000000; |
|
var seed = Environment.TickCount; |
|
var buffer = new byte[runs]; |
|
|
|
// dotNET Random |
|
|
|
GenerateNumbersWithRandom(seed, runs, "dn-next.txt", (w, v) => w.Write(v), g => g.Next()); |
|
GenerateNumbersWithRandom(seed, runs, "dn-nextdouble.txt", (w, v) => w.Write(v), g => g.NextDouble()); |
|
GenerateNumbersWithRandom(seed, 4, "dn-bytes.txt", (w, v) => w.Write(v), g => |
|
{ |
|
g.NextBytes(buffer); |
|
return buffer; |
|
}); |
|
|
|
|
|
// XorShift128+ |
|
|
|
GenerateNumbersWithXorShift(seed, runs, "xs-next.txt", (w, v) => w.Write(v), g => g.Next()); |
|
GenerateNumbersWithXorShift(seed, runs, "xs-nextdouble.txt", (w, v) => w.Write(v), g => g.NextDouble()); |
|
GenerateNumbersWithXorShift(seed, 4, "xs-bytes.txt", (w, v) => w.Write(v), g => |
|
{ |
|
g.NextBytes(buffer); |
|
return buffer; |
|
}); |
|
|
|
|
|
// XorShiRo128+ |
|
|
|
GenerateNumbersWithXorShiRo(seed, runs, "xsr-next.txt", (w, v) => w.Write(v), g => g.Next()); |
|
GenerateNumbersWithXorShiRo(seed, runs, "xsr-nextdouble.txt", (w, v) => w.Write(v), g => g.NextDouble()); |
|
GenerateNumbersWithXorShiRo(seed, 4, "xsr-bytes.txt", (w, v) => w.Write(v), g => |
|
{ |
|
g.NextBytes(buffer); |
|
return buffer; |
|
}); |
|
} |
|
|
|
private static void GenerateNumbersWithRandom<T>( |
|
int seed, |
|
int runs, |
|
string fileName, |
|
Action<BinaryWriter, T> write, |
|
Func<Random, T> method) |
|
{ |
|
var filePath = Path.Combine(BasePath, fileName); |
|
var gen = new Random(seed); |
|
|
|
using (var writer = new BinaryWriter(File.Create(filePath))) |
|
{ |
|
for (var i = 0; i < runs; ++i) |
|
{ |
|
write(writer, method(gen)); |
|
} |
|
} |
|
} |
|
|
|
private static void GenerateNumbersWithXorShift<T>( |
|
int seed, |
|
int runs, |
|
string fileName, |
|
Action<BinaryWriter, T> write, |
|
Func<XorShiftRandom, T> method) |
|
{ |
|
var filePath = Path.Combine(BasePath, fileName); |
|
var gen = new XorShiftRandom(seed); |
|
|
|
using (var writer = new BinaryWriter(File.Create(filePath))) |
|
{ |
|
for (var i = 0; i < runs; ++i) |
|
{ |
|
write(writer, method(gen)); |
|
} |
|
} |
|
} |
|
|
|
private static void GenerateNumbersWithXorShiRo<T>( |
|
int seed, |
|
int runs, |
|
string fileName, |
|
Action<BinaryWriter, T> write, |
|
Func<XorShiRoRandom, T> method) |
|
{ |
|
var filePath = Path.Combine(BasePath, fileName); |
|
var gen = new XorShiRoRandom(seed); |
|
|
|
using (var writer = new BinaryWriter(File.Create(filePath))) |
|
{ |
|
for (var i = 0; i < runs; ++i) |
|
{ |
|
write(writer, method(gen)); |
|
} |
|
} |
|
} |
|
} |
|
} |