1

現在使用している iOS の乱数生成メソッドがあります。正常に動作していますが、出力に常に少なくとも1つの数字が含まれるように変更したいと思います。どうすればいいですか?私が使用している乱数法は次のとおりです。

- (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 が提案した解決策を実装しました (そして、それは明らかに私のものよりも優れています)。私の実装はおそらく完璧ではありません(別の関数を作成する代わりに同じ機能を数回使用しますが、実装するのは難しくないと思います)が、ダンが提案したとおりに機能します。

  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 文字を生成します。これらの少なくとも 1 つが数字の場合、通常どおり 5 番目の文字を生成できます。そうでない場合は、5 番目の文字の数字のセットからのみ選択します。数字の位置にバイアスがかかるのを避けたい場合は、この 5 番目の文字を最後に追加するのではなく、ランダムな位置に挿入できます。

于 2013-01-16T22:24:13.090 に答える