jblocksom
jblocksom

Reputation: 14475

How to create an NSString with one random letter?

I need to create an NSString that has a single random uppercase letter.

I can get random int's fine, and I could construct a C string from it and then make the NSString, but I imagine there has to be a better and more cocoa-ish way.

Thanks!

Upvotes: 2

Views: 4332

Answers (2)

Chuck
Chuck

Reputation: 237030

You can just make an NSString containing what you consider to be letters and pull a random character from it. Here's an example category:

@implementation NSString(RandomLetter)
- (NSString *)randomLetter {
    return [self substringWithRange:[self rangeOfComposedCharacterSequenceAtIndex:random()%[self length]]];
}
@end

(You'll need to srandom(time()) at some point, obviously. Maybe include an initialize method in your category.)

Upvotes: 6

Jon Hess
Jon Hess

Reputation: 14247

I think the best way is to use a c string so that you can use an explicit encoding. Here's an example of that:

NSInteger MyRandomIntegerBetween(NSInteger min, NSInteger max) {
    return (random() % (max - min + 1)) + min;
}

NSString *MyStringWithRandomUppercaseLetter(void) {
    char string[2] = {0, 0};
    string[0] = MyRandomIntegerBetween(65, 90); /// 'A' -> 'Z' in ASCII.
    return [[[NSString alloc] initWithCString:string encoding:NSASCIIStringEncoding] autorelease];
}

Here's an alternative, that's really pretty much the same thing, but avoids the C string.

NSString *MyStringWithRandomUppercaseLetter(void) {
    unichar letter = MyRandomIntegerBetween(65, 90);
    return [[[NSString alloc] initWithCharacters:&letter length:1] autorelease];
}

I prefer the explicit character encodings in the first approach, but they're both correct.

Upvotes: 4

Related Questions