随机播放NSMutableArray

Ale*_*x G 4 xcode objective-c ios

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

 [putNumberUsed objectAtIndex:0] 
Run Code Online (Sandbox Code Playgroud)

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

NSMutableArray *putNumbersUsed= [[NSMutableArray alloc] arrayWithObjects:@"blah1",@"blah2",@"blah3",@"blah4",nil];
Run Code Online (Sandbox Code Playgroud)

小智 9

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

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

我这可能对你有用.

  • 算法不是很好.在此索引处仅使用一个随机索引和交换对象,对象为"i". (6认同)

Muk*_*esh 6

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

您需要导入框架:

ObjeC

#import <GameplayKit/GameplayKit.h>

NSArray *shuffledArray = [yourArray shuffledArray];
Run Code Online (Sandbox Code Playgroud)

迅速

import GameplayKit

let shuffledArray = yourArray.shuffled()
Run Code Online (Sandbox Code Playgroud)


Cœu*_*œur 5

这是一个改组解决方案,当count> 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
Run Code Online (Sandbox Code Playgroud)

然后,您可以像这样洗牌:

[putNumbersUsed unstableShuffle];
Run Code Online (Sandbox Code Playgroud)

此解决方案:

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))))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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)))])
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:还提供了用于常规混排的算法(其中可能具有相同位置的结果)


归档时间:

查看次数:

6346 次

最近记录:

8 年,6 月 前