需要生成一个包含iOS中至少一个数字的随机数

时间:2013-01-16 21:29:33

标签: ios random

我目前在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;
}

感谢所有回复的人。

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:2)

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

如果要生成5个字符的字符串,请先生成4个字符。如果其中至少有一个是数字,则可以正常生成第五个字符。如果不是,则仅从第五个字符的数字集中选择。如果你想避免偏向数字位置,你可以在随机位置插入第五个字符,而不是在最后添加它。