gpt4 book ai didi

ios - 如何从 NSString 中正确随机化字母

转载 作者:行者123 更新时间:2023-11-29 12:51:30 25 4
gpt4 key购买 nike

我正在创建单词扰频器,但在随机化字母时遇到了问题。当字母随机化时,它就没有意义了。

例如,PARK 一词显示为 AAPA。因此,正如您所知道的那样,当需要进行解读时,它对用户来说没有任何意义。

如你所知,我正在使用 .plist 文件来保存单词。

这是我用来随机化字母的代码:

    _words = [NSMutableArray arrayWithCapacity:scramblelength];

for (int i=0;i<scramblelength;i++) {

NSString *letter = [scramble substringWithRange:[scramble rangeOfComposedCharacterSequenceAtIndex:arc4random()%[scramble length]]];

然后,我正在创建 UIImageViews 来显示乱序词:

    if (![letter isEqualToString:@""]) {
GameView *boxes = [[GameView alloc] initWithLetter:letter andSideLength:boxSide];
boxes.center = CGPointMake(xOffset + i*(boxSide + kTileMargin), kScreenHeight/4*3);

[self.scrambleView addSubview:boxes];
[_words addObject:boxes];

我在这里做错了什么?我希望乱序单词中的字母有意义。

请帮忙,我卡在这个了!

谢谢!

最佳答案

只要您的字符串长度适合 32 位,就可以了。如果没有,我会用 C++ 中的统一随机数生成器替换 arc4random_uniform,并将其编译为 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++,请转换为 std::wstring,调用 std::random_shuffle,然后将其转换为 NSString。使用经过验证、经过良好测试的代码时,错误会减少很多。

关于ios - 如何从 NSString 中正确随机化字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22332377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com