Skip to content

Commit

Permalink
Use static RandomValueGenerator (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
StefH committed Aug 3, 2022
1 parent 897d8f1 commit 77d6ad3
Show file tree
Hide file tree
Showing 15 changed files with 119 additions and 76 deletions.
18 changes: 18 additions & 0 deletions src/ConsoleApp/ConsoleApp.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<LangVersion>10.0</LangVersion>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<Compile Include="..\ConsoleAppClassic\MainTest.cs" Link="MainTest.cs" />
</ItemGroup>

<ItemGroup>
<ProjectReference Include="..\RandomDataGenerator\RandomDataGenerator.csproj" />
</ItemGroup>

</Project>
11 changes: 11 additions & 0 deletions src/ConsoleApp/Program.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using ConsoleAppClassic;

namespace ConsoleAppNetCoreApp2;

class Program
{
static void Main(string[] args)
{
MainTest.Run();
}
}
9 changes: 8 additions & 1 deletion src/ConsoleAppClassic/MainTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,13 @@ public static void Run()
var CCN = randomizerCCN.Generate();
Write(randomizerCCN, CCN, $" ({cardIssuer})");
}

for (int i = 0; i < 20; i++)
{
var randomType = new RandomizerCity(new FieldOptionsCity());
var c = randomType.Generate();
Console.WriteLine(c);
}
}

private static void Write<T>(object randomizer, T value, string? extra = null)
Expand All @@ -193,7 +200,7 @@ private static void Write<T>(object randomizer, T value, string? extra = null)
Console.WriteLine("{0}{1}{2} --> '{3}'",
randomizer.GetType().Name,
genericType != null ? $"[{genericType.Name}]" : string.Empty,
extra != null ? extra : string.Empty,
extra ?? string.Empty,
value
);
}
Expand Down
7 changes: 7 additions & 0 deletions src/RandomDataGenerator Solution.sln
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomDataGenerator.Gui6",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomDataGenerator.Gui3", "RandomDataGenerator.Gui3\RandomDataGenerator.Gui3.csproj", "{89571CAF-8CA9-44C2-98AB-D476CA2458DF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{13262322-06A6-4CB7-AABC-78DA60730E07}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -71,6 +73,10 @@ Global
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Release|Any CPU.Build.0 = Release|Any CPU
{13262322-06A6-4CB7-AABC-78DA60730E07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{13262322-06A6-4CB7-AABC-78DA60730E07}.Debug|Any CPU.Build.0 = Debug|Any CPU
{13262322-06A6-4CB7-AABC-78DA60730E07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{13262322-06A6-4CB7-AABC-78DA60730E07}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -83,6 +89,7 @@ Global
{36D5822C-791D-4F72-9ED4-7DBC164A7E24} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
{94DA986E-B36A-4A9A-8B1E-F5BBAE82BEE7} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
{89571CAF-8CA9-44C2-98AB-D476CA2458DF} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
{13262322-06A6-4CB7-AABC-78DA60730E07} = {F8306255-6F4A-4E70-9932-06B2A3C9DF78}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {F00DE8F4-BF0D-49C3-8854-600E8142BE41}
Expand Down
27 changes: 13 additions & 14 deletions src/RandomDataGenerator/Generators/RandomItemFromListGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,21 @@
using System.Collections.Generic;
using System.Linq;

namespace RandomDataGenerator.Generators
namespace RandomDataGenerator.Generators;

internal class RandomItemFromListGenerator<T>
{
internal class RandomItemFromListGenerator<T>
{
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T[] _list;
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T[] _list;

public RandomItemFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
{
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
_randomValueGenerator = new RandomValueGenerator(seed ?? Environment.TickCount);
}
public RandomItemFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
{
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
_randomValueGenerator = RandomValueGeneratorFactory.Create(seed);
}

public T? Generate()
{
return _list.Length > 0 ? _list[_randomValueGenerator.Next(0, _list.Length - 1)] : default(T);
}
public T? Generate()
{
return _list.Length > 0 ? _list[_randomValueGenerator.Next(0, _list.Length - 1)] : default;
}
}
35 changes: 17 additions & 18 deletions src/RandomDataGenerator/Generators/RandomItemsFromListGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,28 @@
using System.Collections.Generic;
using System.Linq;

namespace RandomDataGenerator.Generators
namespace RandomDataGenerator.Generators;

internal class RandomItemsFromListGenerator<T>
{
internal class RandomItemsFromListGenerator<T>
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T[] _list;

public RandomItemsFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
{
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T[] _list;
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
_randomValueGenerator = RandomValueGeneratorFactory.Create(seed);
}

public RandomItemsFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
public List<T> Generate(int count)
{
var list = new List<T>(count);
for (int i = 0; i < count; i++)
{
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
_randomValueGenerator = new RandomValueGenerator(seed ?? Environment.TickCount);
int index = _randomValueGenerator.Next(0, _list.Length - 1);
list.Add(_list[index]);
}

public List<T> Generate(int count)
{
var list = new List<T>(count);
for (int i = 0; i < count; i++)
{
int index = _randomValueGenerator.Next(0, _list.Length - 1);
list.Add(_list[index]);
}

return list;
}
return list;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System.Collections.Generic;

namespace RandomDataGenerator.Generators
namespace RandomDataGenerator.Generators;

internal class RandomStringFromListGenerator : RandomItemFromListGenerator<string>
{
internal class RandomStringFromListGenerator : RandomItemFromListGenerator<string>
public RandomStringFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
{
public RandomStringFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
{
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
using System.Collections.Generic;

namespace RandomDataGenerator.Generators
namespace RandomDataGenerator.Generators;

internal class RandomStringsFromListGenerator : RandomItemsFromListGenerator<string>
{
internal class RandomStringsFromListGenerator : RandomItemsFromListGenerator<string>
public RandomStringsFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
{
public RandomStringsFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
{
}
}
}
31 changes: 14 additions & 17 deletions src/RandomDataGenerator/Generators/RandomThingsGenerator.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,20 @@
using System;
namespace RandomDataGenerator.Generators;

namespace RandomDataGenerator.Generators
internal class RandomThingsGenerator<T>
{
internal class RandomThingsGenerator<T>
{
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T _min;
private readonly T _max;
private readonly RandomValueGenerator _randomValueGenerator;
private readonly T _min;
private readonly T _max;

public RandomThingsGenerator(T min, T max, int? seed)
{
_min = min;
_max = max;
_randomValueGenerator = new RandomValueGenerator(seed ?? Environment.TickCount);
}
public RandomThingsGenerator(T min, T max, int? seed)
{
_min = min;
_max = max;
_randomValueGenerator = RandomValueGeneratorFactory.Create(seed);
}

public T Generate()
{
return _randomValueGenerator.Next(_min, _max);
}
public T Generate()
{
return _randomValueGenerator.Next(_min, _max);
}
}
2 changes: 1 addition & 1 deletion src/RandomDataGenerator/Generators/RandomValueGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace RandomDataGenerator.Generators
internal class RandomValueGenerator
{
private const double Tolerance = double.Epsilon;
private Random _rnf;
private Random _rnf = new();
private double _storedUniformDeviate;
private bool _storedUniformDeviateIsGood;

Expand Down
13 changes: 13 additions & 0 deletions src/RandomDataGenerator/Generators/RandomValueGeneratorFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;

namespace RandomDataGenerator.Generators;

internal static class RandomValueGeneratorFactory
{
private static readonly RandomValueGenerator Value = new(Environment.TickCount);

public static RandomValueGenerator Create(int? seed)
{
return seed is null ? Value : new RandomValueGenerator(seed.Value);
}
}
7 changes: 2 additions & 5 deletions src/RandomDataGenerator/Randomizers/RandomizerAbstract.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using System;
using RandomDataGenerator.FieldOptions;
using RandomDataGenerator.FieldOptions;
using RandomDataGenerator.Generators;

namespace RandomDataGenerator.Randomizers;
Expand All @@ -8,13 +7,11 @@ public abstract class RandomizerAbstract<TOptions> where TOptions : FieldOptions
{
private readonly RandomValueGenerator _randomValueGenerator;
protected readonly TOptions Options;


protected RandomizerAbstract(TOptions options)
{
Options = options;

_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);
_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
}

protected virtual bool IsNull()
Expand Down
2 changes: 1 addition & 1 deletion src/RandomDataGenerator/Randomizers/RandomizerBytes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public class RandomizerBytes : RandomizerAbstract<FieldOptionsBytes>, IRandomize
public RandomizerBytes(FieldOptionsBytes options)
: base(options)
{
_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);
_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
}

public byte[] Generate()
Expand Down
7 changes: 3 additions & 4 deletions src/RandomDataGenerator/Randomizers/RandomizerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace RandomDataGenerator.Randomizers;

public static class RandomizerFactory
{
private static readonly ConcurrentDictionary<string, object> Cache = new ConcurrentDictionary<string, object>();
private static readonly ConcurrentDictionary<string, object> Cache = new();

public static IRandomizerBytes GetRandomizer(IFieldOptionsBytes fieldOptions)
{
Expand Down Expand Up @@ -72,7 +72,7 @@ private static object CreateRandomizer(object fieldOptions)
string typeName;
if (fieldOptionsType.GetTypeInfo().BaseType?.Name.EndsWith("Number`1") == true)
{
Type genericType = fieldOptionsType.GetTypeInfo().BaseType.GetTypeInfo().GetGenericTypeArguments().FirstOrDefault();
var genericType = fieldOptionsType.GetTypeInfo().BaseType.GetTypeInfo().GetGenericTypeArguments().FirstOrDefault();
if (RandomValueGenerator.SupportedTypes.Contains(genericType))
{
typeName = fieldOptionsFullName.Replace($"FieldOptions.{fieldOptionsType.Name}", $"Randomizers.RandomizerNumber`1[{genericType}]");
Expand All @@ -88,7 +88,6 @@ private static object CreateRandomizer(object fieldOptions)
}

var type = Type.GetType(typeName, true);

return Activator.CreateInstance(type, fieldOptions);
return Activator.CreateInstance(type!, fieldOptions);
}
}
8 changes: 3 additions & 5 deletions src/RandomDataGenerator/Randomizers/RandomizerTextWords.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
using RandomDataGenerator.Data;
using System.Collections.Generic;
using RandomDataGenerator.Data;
using RandomDataGenerator.Extensions;
using RandomDataGenerator.FieldOptions;
using RandomDataGenerator.Generators;
using System;
using System.Collections.Generic;

namespace RandomDataGenerator.Randomizers;

Expand All @@ -14,8 +13,7 @@ public class RandomizerTextWords : RandomizerAbstract<FieldOptionsTextWords>, IR

public RandomizerTextWords(FieldOptionsTextWords options) : base(options)
{
_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);

_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
_generator = new RandomStringFromListGenerator(ListData.Instance.LoremIpsumWords, options.Seed);
}

Expand Down

0 comments on commit 77d6ad3

Please sign in to comment.