1

我目前正在使用的 iOS 中有一个随机数生成器方法。虽然它工作正常,但我想对其进行修改,使其输出中始终包含至少一个数字。我该怎么做?这是我正在使用的随机数方法:

- (NSString *)generateRandString {

    NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
    NSMutableString *s = [NSMutableString stringWithCapacity:5];
    for (NSUInteger i = 0U; i < 5; i++) {

        u_int32_t r = arc4random() % [alphabet length];
        unichar c = [alphabet characterAtIndex:r];
        [s appendFormat:@"%C", c];

    }

    return s;
}

提前感谢所有回复的人。

4

2 回答 2

3

这是我编辑和检查的解决方案:

- (NSString *)generateRandString {

         NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
         NSMutableString *s;
         NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];

         do
        {
            s = [NSMutableString stringWithCapacity:5];
           for (NSUInteger i = 0U; i < 5; i++)
           {

              u_int32_t r = arc4random() % [alphabet length];
              unichar c = [alphabet characterAtIndex:r];
              [s appendFormat:@"%C", c];
            }
       }
       while ([s rangeOfCharacterFromSet:set].location == NSNotFound);  

      return s;
 }

我还实施了 Dan Dyer 建议的解决方案(它显然比我的要好)。我的实现可能并不完美(我多次使用相同的功能,而不是为它创建一个单独的函数,但我相信这对你来说并不难实现),但它的工作原理与 Dan 提出的完全一样。

  NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s  = [NSMutableString string];
NSCharacterSet *set = [NSCharacterSet decimalDigitCharacterSet];
NSString *digits    = @"0123456789";

for (NSUInteger i = 0U; i < 4; i++)
{
    u_int32_t r = arc4random() % [alphabet length];
    unichar c = [alphabet characterAtIndex:r];
    [s appendFormat:@"%C", c];
}

if ([s rangeOfCharacterFromSet:set].location == NSNotFound)
{
    u_int32_t r = arc4random() % [digits length];
    unichar c = [digits characterAtIndex:r];
    [s appendFormat:@"%C", c];
}
else
{
    u_int32_t r = arc4random() % [alphabet length];
    unichar c = [alphabet characterAtIndex:r];
    [s insertString:[NSString stringWithFormat:@"%C", c] atIndex:arc4random() % s.length];
}
于 2013-01-16T21:43:33.883 回答
2

而不是生成整个字符串,然后在它不包含任何数字时拒绝它,这可能需要多次迭代才能生成有效的字符串(您生成的任何 5 个字符的字符串有 41.5% 的可能性不会包含digit),一种更有效的方法是在生成字符串时进行跟踪。

如果要生成 5 个字符的字符串,首先生成 4 个字符。如果其中至少一个是数字,则可以正常生成第五个字符。如果不是,请仅从第五个字符的数字集中选择。如果您想避免数字位置出现偏差,您可以在随机位置插入第五个字符,而不是在末尾添加。

于 2013-01-16T22:24:13.090 回答