只要您的字符串长度适合 32 位,这应该没问题。如果没有,我将用arc4random_uniform
C++ 中的统一随机数生成器替换并将其编译为 Objective-C++ 模块。
该代码简单地遍历字符串,并将每个组合字符序列与来自同一字符串的一些随机组合字符序列交换。
对不起,这就是当你傲慢只输入代码时会发生的事情。让我知道如果你有这个问题...
对于更大的字符串,有一种更有效的方法,但这似乎可以解决问题。
NSMutableString
类别...
@interface NSMutableString (Scramble)
- (void)scramble;
@end
@implementation NSMutableString (Scramble)
static void
swapRanges(NSMutableString *string, NSRange iRange, NSRange jRange)
{
// Need to replace the "trailing" component first
if (NSEqualRanges(iRange, jRange)) return;
if (iRange.location > jRange.location) {
NSRange tmpRange = iRange;
iRange = jRange;
jRange = tmpRange;
}
NSString *iString = [self substringWithRange:iRange];
NSString *jString = [self substringWithRange:jRange];
[string replaceCharactersInRange:jRange withString:iString];
[string replaceCharactersInRange:iRange withString:jString];
}
- (void)scramble
{
for (NSUInteger i = 0; i < self.length; ++i) {
NSRange iRange = [self rangeOfComposedCharacterSequenceAtIndex:i];
NSUInteger j = arc4random_uniform(self.length);
NSRange jRange = [self rangeOfComposedCharacterSequenceAtIndex:j];
swapRanges(self, iRange, jRange);
}
}
@end
NSString
类别...
@interface NSString (Scramble)
- (NSString*)scrambledString;
@end
@implementation NSString (Scramble)
- (NSString *)scrambledString
{
NSMutableString *result = [self mutableCopy];
[result scramble];
return [result copy];
}
@end
样品使用...
[someMutableString scramble];
NSString *mixedUp = [someString scrambledString];
或者,如果您对 C++ 感到满意,请转换为 a std::wstring
,调用std::random_shuffle
,然后将其转换为 a NSString
。使用经过验证的、经过良好测试的代码时,错误会减少很多。