Если количество возможных целых чисел, из которых вы черпаете, значительно больше (скажем, фактор 2), чем количество целых чисел, которое вы хотите, вы можете просто использовать HashSet<T>
для проверки на наличие дубликатов.
List<int> GetUniqueRandoms(Random random, int count)
{
List<int> result = new List<int>(count);
HashSet<int> set = new HashSet<int>(count);
for(int i = 0; i < count; i++)
{
int num;
do
{
num = random.NextInt();
while(!set.Add(num));
result.Add(num);
}
return result;
}
Это выделяет коллекции с правильной емкостью, чтобы избежать перераспределения во время роста.Поскольку ваши коллекции большие, это должно стать большим улучшением.
Вы также можете использовать Distinct
один раз:
IEnumerable<int> RandomSequence(Random random)
{
while(true)
{
yield return random.NextInt();
}
}
RandomSequence(rand).Distinct().Take(1000000000).ToList();
Но для обоих решений вам нужно достаточно памяти для HashSet<int>
и a List<int>
.
Если количество возможных целых чисел, из которых вы рисуете, примерно равно количеству целых чисел, которое вы хотите, вы можете создать массив, содержащий все из них, перемешатьи, наконец, отключите те, которые вам не интересны.
Вы можете использовать Реализация перемешивания Джона Скита .