EN
C#/.NET - generate unique random numbers
12 points
There is couple of ways to generate unique random numbers in C#/.NET.
xxxxxxxxxx
1
public static class RandomUtils
2
{
3
public static int[] generateUniqueNumbers(int minValue, int maxValue)
4
{
5
if (minValue > maxValue)
6
throw new ArgumentException("Minimal value cannot be bigger than maximal value.");
7
8
int[] values = new int[maxValue - minValue + 1];
9
10
for (int i = 0; i < values.Length; ++i)
11
values[i] = minValue + i;
12
13
Random random = new Random();
14
15
for (int i = 0; i < values.Length; ++i)
16
{
17
int index = random.Next(values.Length);
18
19
if (i == index)
20
continue;
21
22
int tmp = values[i];
23
24
values[i] = values[index];
25
values[index] = tmp;
26
}
27
28
return values;
29
}
30
}
Example:
xxxxxxxxxx
1
int[] ranges = {
2
// min, max,
3
5, 15,
4
-4, 4
5
};
6
7
for(int i = 0; i < ranges.Length; i += 2)
8
{
9
int minValue = ranges[i + 0];
10
int maxValue = ranges[i + 1];
11
12
int[] values = RandomUtils.generateUniqueNumbers(minValue, maxValue);
13
14
Console.WriteLine("Random unique values from " + minValue + " to " + maxValue + ": ");
15
16
foreach (int entry in values)
17
Console.Write(entry + " ");
18
19
Console.WriteLine();
20
Console.WriteLine();
21
}
Output:
xxxxxxxxxx
1
Random unique values from 5 to 15:
2
14 8 15 7 5 6 10 9 13 11 12
3
4
Random unique values from -4 to +4:
5
0 -4 4 1 -3 2 3 -1 -2
xxxxxxxxxx
1
public static class RandomUtils
2
{
3
public static int[] generateUniqueNumbers(int minValue, int maxValue)
4
{
5
if (minValue > maxValue)
6
throw new ArgumentException("Minimal value cannot be bigger than maximal value.");
7
8
int[] values = new int[maxValue - minValue + 1];
9
10
for (int i = 0; i < values.Length; ++i)
11
values[i] = minValue + i;
12
13
Random random = new Random();
14
15
Array.Sort(values, (a, b) => random.Next(-1, 2));
16
17
return values;
18
}
19
}
Example:
xxxxxxxxxx
1
int[] ranges = {
2
// min, max,
3
5, 15,
4
-4, 4
5
};
6
7
for(int i = 0; i < ranges.Length; i += 2)
8
{
9
int minValue = ranges[i + 0];
10
int maxValue = ranges[i + 1];
11
12
int[] values = RandomUtils.generateUniqueNumbers(minValue, maxValue);
13
14
Console.WriteLine("Random unique values from " + minValue + " to " + maxValue + ": ");
15
16
foreach (int entry in values)
17
Console.Write(entry + " ");
18
19
Console.WriteLine();
20
Console.WriteLine();
21
}
Output:
xxxxxxxxxx
1
Random unique values from 5 to 15:
2
6 5 7 10 8 11 9 12 13 14 15
3
4
Random unique values from -4 to 4:
5
-3 -4 -2 1 -1 0 4 2 3
xxxxxxxxxx
1
public static class RandomUtils
2
{
3
public static int[] generateUniqueNumbers(int minValue, int maxValue)
4
{
5
if (minValue > maxValue)
6
throw new ArgumentException("Minimal value cannot be bigger than maximal value.");
7
8
Random random = new Random();
9
10
int[] values = Enumerable.Range(minValue, maxValue - minValue + 1)
11
.OrderBy((a) => random.Next(-1, 2))
12
.ToArray();
13
14
return values;
15
}
16
}
Example:
xxxxxxxxxx
1
int[] ranges = {
2
// min, max,
3
5, 15,
4
-4, 4
5
};
6
7
for(int i = 0; i < ranges.Length; i += 2)
8
{
9
int minValue = ranges[i + 0];
10
int maxValue = ranges[i + 1];
11
12
int[] values = RandomUtils.generateUniqueNumbers(minValue, maxValue);
13
14
Console.WriteLine("Random unique values from " + minValue + " to " + maxValue + ": ");
15
16
foreach (int entry in values)
17
Console.Write(entry + " ");
18
19
Console.WriteLine();
20
Console.WriteLine();
21
}
Output:
xxxxxxxxxx
1
Random unique values from 5 to 15:
2
5 7 8 9 11 13 14 6 10 12 15
3
4
Random unique values from -4 to 4:
5
-3 0 -2 -1 1 2 4 -4 3
xxxxxxxxxx
1
public static class RandomUtils
2
{
3
public static int[] generateUniqueNumbers(int minValue, int maxValue)
4
{
5
if (minValue > maxValue)
6
throw new ArgumentException("Minimal value cannot be bigger than maximal value.");
7
8
Random random = new Random();
9
HashSet<int> values = new HashSet<int>(maxValue - minValue + 1);
10
11
for (int i = minValue; i < maxValue;)
12
{
13
int value = random.Next(minValue, maxValue + 1);
14
15
if(values.Add(value))
16
i += 1;
17
}
18
19
return values.ToArray();
20
}
21
}
Example:
xxxxxxxxxx
1
int[] ranges = {
2
// min, max,
3
5, 15,
4
-4, 4
5
};
6
7
for(int i = 0; i < ranges.Length; i += 2)
8
{
9
int minValue = ranges[i + 0];
10
int maxValue = ranges[i + 1];
11
12
int[] values = RandomUtils.generateUniqueNumbers(minValue, maxValue);
13
14
Console.WriteLine("Random unique values from " + minValue + " to " + maxValue + ": ");
15
16
foreach (int entry in values)
17
Console.Write(entry + " ");
18
19
Console.WriteLine();
20
Console.WriteLine();
21
}
Output:
xxxxxxxxxx
1
Random unique values from 5 to 15:
2
5 14 8 11 10 12 9 13 7 6
3
4
Random unique values from -4 to 4:
5
1 -4 -2 2 3 0 -1 -3
Note: generating random unique values with HashSet
could take in most worse case much more iterations than number of expected numbers.