2013-04-07 56 views
1

我使用洗牌arc4random_uniform(數組)如下:什麼會導致arc4random_uniform重新生成相同的序列?

int count = [arr count]; 
for (int i = 0; i < count; i++) { 
    int n = arc4random_uniform(count - i) + i; 
    [arr exchangeObjectAtIndex:i withObjectAtIndex:n]; 
} 

數組包含32張撲克牌,而許多用戶也報告說,他們所看到的同一張卡的序列,反覆進行。創建陣列的步驟如下:

  1. 將所有卡以特定順序添加到數組中;
  2. 使用上述循環對數組進行混洗。

我從文檔中瞭解到,arc4random_uniform不需要播種。所以我的問題是:

  1. 什麼會導致由arc4random_uniform產生的序列重複?
  2. 有什麼我可以做的,以儘量減少重複的概率,而不是保存最後生成的序列?基於隨機數多次洗牌是個好主意?

回答

0

我將你的代碼粘貼到我正在處理的應用程序中。

程序被調用x次:

for (int i = 0; i < 5; i++) { 
    [self trySort]; 
} 

常規負載的數組,排序它,然後打印:

- (void)trySort { 
    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", nil]; 
    //code pasted from question 
    int count = [arr count]; 
    for (int i = 0; i < count; i++) { 
     int n = arc4random_uniform(count - i) + i; 
     [arr exchangeObjectAtIndex:i withObjectAtIndex:n]; 
    } 
    // 
    NSLog(@"%@%@%@%@%@%@%@%@%@%@%@%@", [arr objectAtIndex:0], [arr objectAtIndex:1], [arr objectAtIndex:2], [arr objectAtIndex:3], [arr objectAtIndex:4], [arr objectAtIndex:5], [arr objectAtIndex:6], [arr objectAtIndex:7], [arr objectAtIndex:8], [arr objectAtIndex:9], [arr objectAtIndex:10], [arr objectAtIndex:11]); 
} 

結果合理分類:

2013-04-07 16:24:50.923 xxx[2122:c07] BIAKHFDEGCLJ 
2013-04-07 16:24:50.927 xxx[2122:c07] DGICJHLBAKFE 
2013-04-07 16:24:50.928 xxx[2122:c07] HIGEFADJLCKB 
2013-04-07 16:24:50.928 xxx[2122:c07] IHFDBJEALCKG 
2013-04-07 16:24:50.928 xxx[2122:c07] GBEHIFCKAJDL 

是它可能在你的數組被加載的時間和它被排序的時間之間,有些事情會阻止這樣做RT?

+0

謝謝瑞克。我同意你的看法,我也不能重現這個問題,這就是爲什麼我問什麼會導致問題發生。他們說卡片實際上總是被洗牌,但洗牌的結果本身會出現多次。例如,如果洗牌的結果是序列DEFGRSKL,他們會在短時間內看到它不止一次。 – Motasim 2013-04-08 04:37:03

相關問題