-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
119 lines (104 loc) · 4.98 KB
/
Program.cs
File metadata and controls
119 lines (104 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace SomethingAboutGeneratingRandomNumber
{
internal class Program
{
private static void Main(string[] args)
{
Console.WriteLine("start");
List<int> valueSet1, valueSet2, valueSet3;
const int count = 10;
const int min = 1;
const int max = 10;
Console.WriteLine("----------------different instance");
Console.WriteLine(Environment.TickCount);
valueSet1 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
valueSet2 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
valueSet3 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
PrintValues(valueSet1, valueSet2, valueSet3);
Console.WriteLine("----------------different instance with sleep");
Console.WriteLine(Environment.TickCount);
valueSet1 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
Thread.Sleep(100);
valueSet2 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
valueSet3 = GetRandomValuesFromRandom(new Random(), count, min, max);
Console.WriteLine(Environment.TickCount);
PrintValues(valueSet1, valueSet2, valueSet3);
Console.WriteLine("----------------different instance with guid seed");
valueSet1 = GetRandomValuesFromRandom(new Random(Guid.NewGuid().GetHashCode()), count, min, max);
valueSet2 = GetRandomValuesFromRandom(new Random(Guid.NewGuid().GetHashCode()), count, min, max);
valueSet3 = GetRandomValuesFromRandom(new Random(Guid.NewGuid().GetHashCode()), count, min, max);
PrintValues(valueSet1, valueSet2, valueSet3);
Console.WriteLine("----------------same instance");
var rnd = new Random();
valueSet1 = GetRandomValuesFromRandom(rnd, count, min, max);
valueSet2 = GetRandomValuesFromRandom(rnd, count, min, max);
valueSet3 = GetRandomValuesFromRandom(rnd, count, min, max);
PrintValues(valueSet1, valueSet2, valueSet3);
Console.WriteLine("----------------use RNGCryptoServiceProvider");
valueSet1 = GetRandomValuesWithRNGCryptoServiceProvider(count, min, max);
valueSet2 = GetRandomValuesWithRNGCryptoServiceProvider(count, min, max);
valueSet3 = GetRandomValuesWithRNGCryptoServiceProvider(count, min, max);
PrintValues(valueSet1, valueSet2, valueSet3);
Console.WriteLine("all done");
Console.ReadLine();
}
private static List<int> GetRandomValuesFromRandom(Random rnd, int count, int min, int max)
{
var values = new List<int>();
for (var i = 0; i < count; i++)
{
values.Add(rnd.Next(min, max));
}
return values;
}
// https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.rngcryptoserviceprovider?redirectedfrom=MSDN&view=netframework-4.8
// https://stackoverflow.com/questions/6299197/rngcryptoserviceprovider-generate-number-in-a-range-faster-and-retain-distribu
static List<int> GetRandomValuesWithRNGCryptoServiceProvider(int count, int min, int max)
{
var values = new List<int>();
//or using (var rng = RandomNumberGenerator.Create())
using (var rng = new RNGCryptoServiceProvider())
{
var randomNumber = new byte[4];
for (var i = 0; i < count; i++)
{
var value = RandomNumberGeneratorNext(rng, randomNumber, min, max);
values.Add(value);
}
}
return values;
}
private static int RandomNumberGeneratorNext(RandomNumberGenerator rng, byte[] buffer, int minValue, int maxValue)
{
if (minValue == maxValue) return minValue;
long diff = maxValue - minValue;
while (true)
{
rng.GetBytes(buffer);
var rand = BitConverter.ToUInt32(buffer, 0);
var max = (1 + (long) uint.MaxValue);
var remainder = max % diff;
if (rand < max - remainder)
{
return (int) (minValue + (rand % diff));
}
}
}
private static void PrintValues(params List<int>[] valuesArray)
{
valuesArray.ToList().ForEach(values => Console.WriteLine(string.Join(",", values)));
}
}
}