如何在c#中使用随机类来避免数字重复?

时间:2011-04-09 04:50:36

标签: random numbers

嗨,我使用随机类来获取随机数,但我的要求是一旦它生成一个不应该不再重复请帮助我。

2 个答案:

答案 0 :(得分:2)

保留生成的数字列表,并在返回下一个随机数之前检查此列表。

由于您尚未指定语言,我将使用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 :(得分:1)

以下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;
   }
}

这种技术的缺点是它倾向于使用更多的内存,但它应该比其他方法快得多,因为每次获得随机数时都不需要查看大容器。