Я работаю над статическим классом для предоставления случайных значений для моей программы, но есть некоторые проблемы с реализацией эквивалента функциональности Random.Next (int maxValue):
public class CRandom {
static readonly byte[] randomSet;
static readonly Func<int> closedIndex;
static CRandom() {
randomSet = new byte[60000000];
closedIndex = _ClosedIndex(0);
RNGCryptoServiceProvider Gen = new RNGCryptoServiceProvider();
Gen.GetBytes(randomSet);
}
public static int Next() {
int index = closedIndex();
return Convert.ToInt32(randomSet[index]);
}
public static int Next(int maxValue) {
int index = closedIndex();
byte[] remainingSet = randomSet.Skip(index + 1).ToArray();
byte next = remainingSet.First(x => Convert.ToInt32(x) < maxValue);
return Convert.ToInt32(next);
}
public static Func<int> _ClosedIndex(int seed) {
// seed is the initial value
int _index = seed - 1;
Func<int> del = new Func<int>(() =>
{ // always returns auto-incremented value
_index++;
return _index;
});
return del;
}
}
По сути, он заполняет статический / только для чтения байтовый массив случайных значений, а в случае метода Next (maxValue) просто получает следующее значение, которое находится в диапазоне, но ранее не использовалось. Однако попытка Next (100) в цикле дает следующие результаты, которые, очевидно, не случайны:
53
20
20
34
34
73
73
73
73
Это также очень медленный способ сделать это. Я уверен, что есть лучший способ, но я не совсем понимаю, как работает Random.Next ().