<p>If you have an <code>NSMutableArray</code>, how do you shuffle the elements randomly?</p>

<p>(I have my own answer for this, which is posted below, but I'm new to Cocoa and I'm interested to know if there is a better way.)</p>

<hr>

<p>Update: As noted by @Mukesh, as of iOS 10+ and macOS 10.12+, there is an <code>-[NSMutableArray shuffledArray]</code> method that can be used to shuffle. See <a href="https://developer.apple.com/documentation/foundation/nsarray/1640855-shuffledarray?language=objc" rel="noreferrer">https://developer.apple.com/documentation/foundation/nsarray/1640855-shuffledarray?language=objc</a> for details. (But note that this creates a new array, rather than shuffling the elements in place.)</p>

I solved this by adding a category to NSMutableArray.
Edit:
Removed unnecessary method thanks to answer by Ladd.
Edit:
Changed
```
(arc4random() % nElements)
```
to
```
arc4random_uniform(nElements)
```
thanks to answer by Gregory Goltsov and comments by miho and blahdiblah
Edit:
Loop improvement, thanks to comment by Ron
Edit:
Added check that array is not empty, thanks to comment by Mahesh Agrawal
```
```
//  NSMutableArray_Shuffling.h

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#else
#include <Cocoa/Cocoa.h>
#endif

// This category enhances NSMutableArray by providing
// methods to randomly shuffle the elements.
@interface NSMutableArray (Shuffling)
- (void)shuffle;
@end

//  NSMutableArray_Shuffling.m

#import "NSMutableArray_Shuffling.h"

@implementation NSMutableArray (Shuffling)

- (void)shuffle
{
    NSUInteger count = [self count];
    if (count <= 1) return;
    for (NSUInteger i = 0; i < count - 1; ++i) {
        NSInteger remainingCount = count - i;
        NSInteger exchangeIndex = i + arc4random_uniform((u_int32_t )remainingCount);
        [self exchangeObjectAtIndex:i withObjectAtIndex:exchangeIndex];
    }
}

@end
```
```