Как избежать повторения числа с помощью случайного класса в C #? - PullRequest
1 голос
/ 09 апреля 2011

привет, я использую класс Random для получения случайных чисел, но мое требование - как только он генерирует одно нет, которое не должно повторяться, пожалуйста, помогите мне.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Сохраните список сгенерированных чисел и проверьте этот список перед возвратом следующего случайного числа.

Поскольку вы не указали язык, я буду использовать C #

List<int> generated = new List<int>;
public int Next()
{
   int r;
   do {  r = Random.Next() } while generated.Contains(r);
   generated.Add(r);
   return r;
}
1 голос
/ 09 апреля 2011

Следующий код 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;
   }
}

Недостаток этого метода заключается в том, что он имеет тенденцию использовать больше памяти, но он должен быть значительно быстрее, чем другие подходы, поскольку ему не нужно просматривать большой контейнер каждый раз, когда получается случайное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...