0

私は Java プログラマーで、しばらくの間 obj-C に移行する必要があります。

ランダムな英数字コードを生成するときに混乱しました...ここに私のJavaコード:

PS: 次のようなコードを生成したい: Gh12PU67, AC88pP13, Bk81gH89

private String generateCode(){
 String code = "";
 Random r = new Random();
 char[] c = new char[]{'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

 for(int i = 0; i<4; i++){
  int uplow = r.nextInt(2);
  String temp = ""+ c[r.nextInt(c.length)];
  if(uplow==1)
   code = code + temp.toUpperCase();
 else
   code = code + temp;

 if((i+1)%2==0){
   code += r.nextInt(10);
   code += r.nextInt(10);
 }
}

return code;
}

次に、OBJ-Cで作成します

-(void)generateCode{
    NSString *alphabet  = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
    NSMutableString *s = [NSMutableString stringWithCapacity:4];
    for (NSUInteger i = 0U; i < 4; i++) {
        u_int32_t r = arc4random() % [alphabet length];
        unichar c = [alphabet characterAtIndex:r];
        [s appendFormat:@"%C", c];

    }
    NSLog(@"s-->%@",s);
}

しかし、AC88pP13 は、文字列、文字列、数値、数値、小文字の文字列、数値、数値...

その場合、私の人生は3日間台無しになります...

4

2 に答える 2

1

あなたの Objective-C コードは良さそうに見えますが (@Wain が上記のコメントで正しく言ったように)、Java 関数 function には 2 文字の後に 2 桁を挿入するロジックが含まれていますが、これは Objective-C メソッドでは複製されていません。

そのロジックを少し曖昧にして、次のように書きます。

- (void)generateCode
{
    static NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY";
    static NSString *digits = @"0123456789";
    NSMutableString *s = [NSMutableString stringWithCapacity:8];
    for (NSUInteger i = 0; i < 2; i++) {
        uint32_t r;

        // Append 2 random letters:
        r = arc4random_uniform((uint32_t)[letters length]);
        [s appendFormat:@"%C", [letters characterAtIndex:r]];
        r = arc4random_uniform((uint32_t)[letters length]);
        [s appendFormat:@"%C", [letters characterAtIndex:r]];

        // Append 2 random digits:
        r = arc4random_uniform((uint32_t)[digits length]);
        [s appendFormat:@"%C", [digits characterAtIndex:r]];
        r = arc4random_uniform((uint32_t)[digits length]);
        [s appendFormat:@"%C", [digits characterAtIndex:r]];

    }
    NSLog(@"s-->%@",s);
}

備考(man ページから): 上限が 2 の累乗でない場合に「モジュロ バイアス」を回避するため、 よりarc4random_uniform(length)も優先されます。arc4random() % length

備考:code += r.nextInt(10); Java コード の Objective-C へのより正確な翻訳は、次のようになります。

r = arc4random_uniform(10);
[s appendString:[@(r) stringValue]];

乱数からNSNumberオブジェクトを作成し、それを文字列に変換します。@(r)

于 2013-11-09T08:53:05.373 に答える