2012-04-19 86 views
4

我一直在試圖讓非重複arc4random_uniform現在爲我的iPhone應用程序的年齡工作。在沒有運氣的情況下,所有與此有關的問題和答案都在stackoverflow上,現在我希望有人能幫助我。我想要做的是選擇1到104之間的13個不同的隨機數。我已經得到它的工作點,它選擇13個不同的數字,但有時兩個是相同的。非重複arc4random_uniform

int rand = arc4random_uniform(104); 

這就是我正在做的,然後我使用rand從數組中選擇。如果更容易洗牌,然後從頂部選擇13,那麼我會嘗試,但我需要如何幫助,因爲這似乎更難。

感謝您的任何建議。

+0

如果你想洗牌數組或從一個挑隨機物品,我建議您搜索'objective-c數組shuffle'或'randomized queue'。 – Timo 2012-12-11 12:05:03

回答

12

無法保證ar4random_uniform()不會重複。想一下 - 你要求它產生一個介於0和103之間的數字。如果你這樣做了一百五十次,它別無選擇,只能重複其之前的選擇。函數怎麼知道你會多少次請求一個數字?

您必須檢查已獲取的數字列表,如果是重複數據或洗牌數組,請求新數字列表。對此,應該有任何數量的問題。這是最古老的一個:What's the Best Way to Shuffle an NSMutableArray?

有關於不重複的隨機數也不少問題:https://stackoverflow.com/search?q=%5Bobjc%5D+non-repeating+random+numbers

+0

好吧,那基本上是我在找的東西。對不起再次提出同樣的問題,我似乎無法讓我看到其他答案。 – 2012-04-19 17:53:23

+2

+1更加強烈地重申:如果'arc4random_uniform()'不重複,它不會是隨機的。對於相當小的範圍,你應該期望不僅重複,而且重複序列。對於非常小的範圍(如硬幣翻轉),您應該預期很長的重複序列。如果你沒有看到它們,你的隨機數發生器可能有問題。正如喬什所說,然而,你真正想要的是洗牌。 – 2013-05-29 00:12:07

+0

將它們放入一組,直到[set count] == 13。 – RegularExpression 2014-06-25 06:54:26

1

另外,您還可以創建的每105個整數唯一的一個可變數組,並arc4random_uniform([arrayName中的計數]),然後刪除從陣列相同的一個,那麼你會得到一個隨機int值的時間不重複(雖然小數組得到它是預測下一個數字會有怎樣的簡單,只要簡單的概率)

0

最好的算法我發現這個確切的問題在這裏描述:

Algorithm to select a single, random combination of values?

而不是洗牌104個元素的數組,你只需要循環13次。下面是我實現的目標C的算法:

// Implementation of the Floyd algorithm from Programming Pearls. 
// Returns a NSSet of num_values from 0 to max_value - 1. 
static NSSet* getUniqueRandomNumbers(int num_values, int max_value) { 
    assert(max_value >= num_values); 
    NSMutableSet* set = [NSMutableSet setWithCapacity:num_values]; 
    for (int i = max_value - num_values; i < max_value; ++i) { 
     NSNumber* rand = [NSNumber numberWithInt:arc4random_uniform(i)]; 
     if ([set containsObject:rand]) { 
      [set addObject:[NSNumber numberWithInt:i]]; 
     } else { 
      [set addObject:rand]; 
     } 
    } 
    return set; 
} 
2

您可以創建一個NSMutableSet和實現它是這樣的:

NSMutableArray* numbers = [[NSMutableArray alloc] initWithCapacity: 13]; 
NSMutableSet* usedValues = [[NSMutableSet alloc] initWithCapacity: 13]; 

for (int i = 0; i < 13; i++) { 
    int randomNum = arc4random_uniform(104); 
    while ([usedValues containsObject: [NSNumber numberWithInt: randomNum]) {  
    randomNum = arc4random_uniform(104) 
    } 
    [[usedValues addObject: [NSNumber numberWithInt: randomNum]; 
    [numbers addObject: [[NSNumber numberWithInt: randomNum]; 
}