随机播放NSMutableArray

我有一个名为putNumberUsed的NSMutableArray。 它包含以下对象@“blah1,@”blah2“,@”blah3“,@”blah4“。我想随机对这些对象进行随机播放,例如,如果我选择:

[putNumberUsed objectAtIndex:0] 

它会给我任何东西,但“blah1”。 我该怎么做呢? 以下是我目前使用的代码,提前感谢

 NSMutableArray *putNumbersUsed= [[NSMutableArray alloc] arrayWithObjects:@"blah1",@"blah2",@"blah3",@"blah4",nil]; 

我想,你可以为此写一个循环。 请检查以下代码,

 for (int i = 0; i < putNumberUsed.count; i++) { int randomInt1 = arc4random() % [putNumberUsed count]; int randomInt2 = arc4random() % [putNumberUsed count]; [putNumberUsed exchangeObjectAtIndex:randomInt1 withObjectAtIndex:randomInt2]; } 

我这可能对你有用。

来自iOS 10.x ++ 的洗牌arrays新概念由Apple提供,

您需要导入框架:

ObjeC

 #import  NSArray *shuffledArray = [yourArray shuffledArray]; 

迅速

 import GameplayKit let shuffledArray = yourArray.shuffled() 

这是一个改组解决方案,当计数> 1时,所有位置都被迫改变。

添加类别,如NSMutableArray + Shuffle.m:

 @implementation NSMutableArray (Shuffle) // Fisher-Yates shuffle variation with all positions forced to change - (void)unstableShuffle { for (NSInteger i = self.count - 1; i > 0; i--) // note: we use u_int32_t because `arc4random_uniform` doesn't support int64 [self exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((u_int32_t)i)]; } @end 

然后你可以像以下一样洗牌:

 [putNumbersUsed unstableShuffle]; 

这个解决方案

  • 没有模数偏见
  • 没有天真的偏见
  • 没有排序偏见

Swift 3.2和Swift 4等价物是:

 extension Array { mutating func unstableShuffle() { for i in stride(from: count - 1, to: 0, by: -1) { swapAt(i, Int(arc4random_uniform(UInt32(i)))) } } } 

Swift 3.0和3.1等价物是:

 extension Array { mutating func unstableShuffle() { for i in stride(from: count - 1, to: 0, by: -1) { swap(&self[i], &self[Int(arc4random_uniform(UInt32(i)))]) } } } 

注意:也可以使用常规混洗算法(其中可能存在相同位置的结果)

您可以使用以下代码行来对对象进行随机播放,

 [putNumbersUsed exchangeObjectAtIndex:3 withObjectAtIndex:0]; 

我认为这对你有用。

生成索引的随机数

 int randomInt = arc4random() % [putNumberUsed count]; [putNumberUsed objectAtIndex:randomInt]; 

用这个:

 for (int i = 0; i < [putNumberUsed count]; i++) { int random = arc4random() % [putNumberUsed count]; [putNumbersUsed exchangeObjectAtIndex:random withObjectAtIndex:i]; }