Skip to content

Commit 77d6ad3

Browse files
authored
Use static RandomValueGenerator (StefH#22)
1 parent 897d8f1 commit 77d6ad3

15 files changed

+119
-76
lines changed

src/ConsoleApp/ConsoleApp.csproj

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net6.0</TargetFramework>
6+
<LangVersion>10.0</LangVersion>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<Compile Include="..\ConsoleAppClassic\MainTest.cs" Link="MainTest.cs" />
12+
</ItemGroup>
13+
14+
<ItemGroup>
15+
<ProjectReference Include="..\RandomDataGenerator\RandomDataGenerator.csproj" />
16+
</ItemGroup>
17+
18+
</Project>

src/ConsoleApp/Program.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using ConsoleAppClassic;
2+
3+
namespace ConsoleAppNetCoreApp2;
4+
5+
class Program
6+
{
7+
static void Main(string[] args)
8+
{
9+
MainTest.Run();
10+
}
11+
}

src/ConsoleAppClassic/MainTest.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ public static void Run()
185185
var CCN = randomizerCCN.Generate();
186186
Write(randomizerCCN, CCN, $" ({cardIssuer})");
187187
}
188+
189+
for (int i = 0; i < 20; i++)
190+
{
191+
var randomType = new RandomizerCity(new FieldOptionsCity());
192+
var c = randomType.Generate();
193+
Console.WriteLine(c);
194+
}
188195
}
189196

190197
private static void Write<T>(object randomizer, T value, string? extra = null)
@@ -193,7 +200,7 @@ private static void Write<T>(object randomizer, T value, string? extra = null)
193200
Console.WriteLine("{0}{1}{2} --> '{3}'",
194201
randomizer.GetType().Name,
195202
genericType != null ? $"[{genericType.Name}]" : string.Empty,
196-
extra != null ? extra : string.Empty,
203+
extra ?? string.Empty,
197204
value
198205
);
199206
}

src/RandomDataGenerator Solution.sln

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomDataGenerator.Gui6",
3737
EndProject
3838
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RandomDataGenerator.Gui3", "RandomDataGenerator.Gui3\RandomDataGenerator.Gui3.csproj", "{89571CAF-8CA9-44C2-98AB-D476CA2458DF}"
3939
EndProject
40+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ConsoleApp", "ConsoleApp\ConsoleApp.csproj", "{13262322-06A6-4CB7-AABC-78DA60730E07}"
41+
EndProject
4042
Global
4143
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4244
Debug|Any CPU = Debug|Any CPU
@@ -71,6 +73,10 @@ Global
7173
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
7274
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
7375
{89571CAF-8CA9-44C2-98AB-D476CA2458DF}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{13262322-06A6-4CB7-AABC-78DA60730E07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{13262322-06A6-4CB7-AABC-78DA60730E07}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{13262322-06A6-4CB7-AABC-78DA60730E07}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{13262322-06A6-4CB7-AABC-78DA60730E07}.Release|Any CPU.Build.0 = Release|Any CPU
7480
EndGlobalSection
7581
GlobalSection(SolutionProperties) = preSolution
7682
HideSolutionNode = FALSE
@@ -83,6 +89,7 @@ Global
8389
{36D5822C-791D-4F72-9ED4-7DBC164A7E24} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
8490
{94DA986E-B36A-4A9A-8B1E-F5BBAE82BEE7} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
8591
{89571CAF-8CA9-44C2-98AB-D476CA2458DF} = {CD43A6FA-4DEF-47B3-A430-9E7FFAD6B035}
92+
{13262322-06A6-4CB7-AABC-78DA60730E07} = {F8306255-6F4A-4E70-9932-06B2A3C9DF78}
8693
EndGlobalSection
8794
GlobalSection(ExtensibilityGlobals) = postSolution
8895
SolutionGuid = {F00DE8F4-BF0D-49C3-8854-600E8142BE41}

src/RandomDataGenerator/Generators/RandomItemFromListGenerator.cs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,21 @@
22
using System.Collections.Generic;
33
using System.Linq;
44

5-
namespace RandomDataGenerator.Generators
5+
namespace RandomDataGenerator.Generators;
6+
7+
internal class RandomItemFromListGenerator<T>
68
{
7-
internal class RandomItemFromListGenerator<T>
8-
{
9-
private readonly RandomValueGenerator _randomValueGenerator;
10-
private readonly T[] _list;
9+
private readonly RandomValueGenerator _randomValueGenerator;
10+
private readonly T[] _list;
1111

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

18-
public T? Generate()
19-
{
20-
return _list.Length > 0 ? _list[_randomValueGenerator.Next(0, _list.Length - 1)] : default(T);
21-
}
18+
public T? Generate()
19+
{
20+
return _list.Length > 0 ? _list[_randomValueGenerator.Next(0, _list.Length - 1)] : default;
2221
}
2322
}

src/RandomDataGenerator/Generators/RandomItemsFromListGenerator.cs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,29 +2,28 @@
22
using System.Collections.Generic;
33
using System.Linq;
44

5-
namespace RandomDataGenerator.Generators
5+
namespace RandomDataGenerator.Generators;
6+
7+
internal class RandomItemsFromListGenerator<T>
68
{
7-
internal class RandomItemsFromListGenerator<T>
9+
private readonly RandomValueGenerator _randomValueGenerator;
10+
private readonly T[] _list;
11+
12+
public RandomItemsFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
813
{
9-
private readonly RandomValueGenerator _randomValueGenerator;
10-
private readonly T[] _list;
14+
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
15+
_randomValueGenerator = RandomValueGeneratorFactory.Create(seed);
16+
}
1117

12-
public RandomItemsFromListGenerator(int? seed, IEnumerable<T> list, Func<T, bool>? predicate = null)
18+
public List<T> Generate(int count)
19+
{
20+
var list = new List<T>(count);
21+
for (int i = 0; i < count; i++)
1322
{
14-
_list = predicate == null ? list.ToArray() : list.Where(predicate).ToArray();
15-
_randomValueGenerator = new RandomValueGenerator(seed ?? Environment.TickCount);
23+
int index = _randomValueGenerator.Next(0, _list.Length - 1);
24+
list.Add(_list[index]);
1625
}
1726

18-
public List<T> Generate(int count)
19-
{
20-
var list = new List<T>(count);
21-
for (int i = 0; i < count; i++)
22-
{
23-
int index = _randomValueGenerator.Next(0, _list.Length - 1);
24-
list.Add(_list[index]);
25-
}
26-
27-
return list;
28-
}
27+
return list;
2928
}
3029
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
using System.Collections.Generic;
22

3-
namespace RandomDataGenerator.Generators
3+
namespace RandomDataGenerator.Generators;
4+
5+
internal class RandomStringFromListGenerator : RandomItemFromListGenerator<string>
46
{
5-
internal class RandomStringFromListGenerator : RandomItemFromListGenerator<string>
7+
public RandomStringFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
68
{
7-
public RandomStringFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
8-
{
9-
}
109
}
1110
}
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
using System.Collections.Generic;
22

3-
namespace RandomDataGenerator.Generators
3+
namespace RandomDataGenerator.Generators;
4+
5+
internal class RandomStringsFromListGenerator : RandomItemsFromListGenerator<string>
46
{
5-
internal class RandomStringsFromListGenerator : RandomItemsFromListGenerator<string>
7+
public RandomStringsFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
68
{
7-
public RandomStringsFromListGenerator(IEnumerable<string> list, int? seed = null) : base(seed, list)
8-
{
9-
}
109
}
1110
}
Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,20 @@
1-
using System;
1+
namespace RandomDataGenerator.Generators;
22

3-
namespace RandomDataGenerator.Generators
3+
internal class RandomThingsGenerator<T>
44
{
5-
internal class RandomThingsGenerator<T>
6-
{
7-
private readonly RandomValueGenerator _randomValueGenerator;
8-
private readonly T _min;
9-
private readonly T _max;
5+
private readonly RandomValueGenerator _randomValueGenerator;
6+
private readonly T _min;
7+
private readonly T _max;
108

11-
public RandomThingsGenerator(T min, T max, int? seed)
12-
{
13-
_min = min;
14-
_max = max;
15-
_randomValueGenerator = new RandomValueGenerator(seed ?? Environment.TickCount);
16-
}
9+
public RandomThingsGenerator(T min, T max, int? seed)
10+
{
11+
_min = min;
12+
_max = max;
13+
_randomValueGenerator = RandomValueGeneratorFactory.Create(seed);
14+
}
1715

18-
public T Generate()
19-
{
20-
return _randomValueGenerator.Next(_min, _max);
21-
}
16+
public T Generate()
17+
{
18+
return _randomValueGenerator.Next(_min, _max);
2219
}
2320
}

src/RandomDataGenerator/Generators/RandomValueGenerator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace RandomDataGenerator.Generators
1313
internal class RandomValueGenerator
1414
{
1515
private const double Tolerance = double.Epsilon;
16-
private Random _rnf;
16+
private Random _rnf = new();
1717
private double _storedUniformDeviate;
1818
private bool _storedUniformDeviateIsGood;
1919

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System;
2+
3+
namespace RandomDataGenerator.Generators;
4+
5+
internal static class RandomValueGeneratorFactory
6+
{
7+
private static readonly RandomValueGenerator Value = new(Environment.TickCount);
8+
9+
public static RandomValueGenerator Create(int? seed)
10+
{
11+
return seed is null ? Value : new RandomValueGenerator(seed.Value);
12+
}
13+
}

src/RandomDataGenerator/Randomizers/RandomizerAbstract.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System;
2-
using RandomDataGenerator.FieldOptions;
1+
using RandomDataGenerator.FieldOptions;
32
using RandomDataGenerator.Generators;
43

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

1311
protected RandomizerAbstract(TOptions options)
1412
{
1513
Options = options;
16-
17-
_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);
14+
_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
1815
}
1916

2017
protected virtual bool IsNull()

src/RandomDataGenerator/Randomizers/RandomizerBytes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public class RandomizerBytes : RandomizerAbstract<FieldOptionsBytes>, IRandomize
1212
public RandomizerBytes(FieldOptionsBytes options)
1313
: base(options)
1414
{
15-
_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);
15+
_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
1616
}
1717

1818
public byte[] Generate()

src/RandomDataGenerator/Randomizers/RandomizerFactory.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace RandomDataGenerator.Randomizers;
99

1010
public static class RandomizerFactory
1111
{
12-
private static readonly ConcurrentDictionary<string, object> Cache = new ConcurrentDictionary<string, object>();
12+
private static readonly ConcurrentDictionary<string, object> Cache = new();
1313

1414
public static IRandomizerBytes GetRandomizer(IFieldOptionsBytes fieldOptions)
1515
{
@@ -72,7 +72,7 @@ private static object CreateRandomizer(object fieldOptions)
7272
string typeName;
7373
if (fieldOptionsType.GetTypeInfo().BaseType?.Name.EndsWith("Number`1") == true)
7474
{
75-
Type genericType = fieldOptionsType.GetTypeInfo().BaseType.GetTypeInfo().GetGenericTypeArguments().FirstOrDefault();
75+
var genericType = fieldOptionsType.GetTypeInfo().BaseType.GetTypeInfo().GetGenericTypeArguments().FirstOrDefault();
7676
if (RandomValueGenerator.SupportedTypes.Contains(genericType))
7777
{
7878
typeName = fieldOptionsFullName.Replace($"FieldOptions.{fieldOptionsType.Name}", $"Randomizers.RandomizerNumber`1[{genericType}]");
@@ -88,7 +88,6 @@ private static object CreateRandomizer(object fieldOptions)
8888
}
8989

9090
var type = Type.GetType(typeName, true);
91-
92-
return Activator.CreateInstance(type, fieldOptions);
91+
return Activator.CreateInstance(type!, fieldOptions);
9392
}
9493
}

src/RandomDataGenerator/Randomizers/RandomizerTextWords.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
using RandomDataGenerator.Data;
1+
using System.Collections.Generic;
2+
using RandomDataGenerator.Data;
23
using RandomDataGenerator.Extensions;
34
using RandomDataGenerator.FieldOptions;
45
using RandomDataGenerator.Generators;
5-
using System;
6-
using System.Collections.Generic;
76

87
namespace RandomDataGenerator.Randomizers;
98

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

1514
public RandomizerTextWords(FieldOptionsTextWords options) : base(options)
1615
{
17-
_randomValueGenerator = new RandomValueGenerator(Options.Seed ?? Environment.TickCount);
18-
16+
_randomValueGenerator = RandomValueGeneratorFactory.Create(options.Seed);
1917
_generator = new RandomStringFromListGenerator(ListData.Instance.LoremIpsumWords, options.Seed);
2018
}
2119

0 commit comments

Comments
 (0)