随机播放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]; }