2011-04-09 38 views

回答

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; 
} 
+0

是的,這是我能想到的唯一可靠的方式,+1 – 2011-04-09 05:01:53

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

這種技術的缺點是它傾向於使用更多的內存,但它應該是比其他方法顯著更快,因爲它沒有通過大看容器每次獲得一個隨機數。