Следующий код C # показывает, как получить 7 случайных карт без дубликатов. Это наиболее эффективный метод для использования, когда диапазон случайных чисел составляет от 1 до 64 и являются целыми числами:
ulong Card, SevenCardHand;
int CardLoop;
const int CardsInDeck = 52;
Random RandObj = new Random(Seed);
for (CardLoop = 0; CardLoop < 7; CardLoop++)
{
do
{
Card = (1UL << RandObj.Next(CardsInDeck));
} while ((SevenCardHand & Card) != 0);
SevenCardHand |= Card;
}
Если диапазон случайных чисел больше 64, то следующий наиболее эффективный способ получения случайных чисел без дубликатов заключается в следующем из этого кода C #:
const int MaxNums = 1000;
int[] OutBuf = new int[MaxNums];
int MaxInt = 250000; // Reps the largest random number that should be returned.
int Loop, Val;
// Init the OutBuf with random numbers between 1 and MaxInt, which is 250,000.
BitArray BA = new BitArray(MaxInt + 1);
for (Loop = 0; Loop < MaxNums; Loop++)
{
// Avoid duplicate numbers.
for (; ; )
{
Val = RandObj.Next(MaxInt + 1);
if (BA.Get(Val))
continue;
OutBuf[Loop] = Val;
BA.Set(Val, true);
break;
}
}
Недостаток этого метода заключается в том, что он имеет тенденцию использовать больше памяти, но он должен быть значительно быстрее, чем другие подходы, поскольку ему не нужно просматривать большой контейнер каждый раз, когда получается случайное число.