2

ヒストリーボードに 10 個の UIButton を作成しました。
これらの数字を繰り返さない乱数、つまり、ビューが読み込まれるたびに散在する 0 から 9 までの数字を追加したいと考えています。

私はGoogleで見つけようとしましたが、ここで既存のボタン( 10 UIButton )を使用する方法を見つけ、それらをランダムな値に適用するだけです。見つかったほとんどの方法 ( arc4random() % 10)、番号を繰り返します。

すべての結果で、ボタンを動的に作成することがわかりました。これを経験した人はいますか?

4

2 に答える 2

2

数値の配列を作成します。次に、配列内の要素の一連のランダム スワッピングを実行します。これで、一意の番号がランダムな順序で表示されます。

- (NSArray *)generateRandomNumbers:(NSUInteger)count {
    NSMutableArray *res = [NSMutableArray arrayWithCapacity:count];
    // Populate with the numbers 1 .. count (never use a tag of 0)
    for (NSUInteger i = 1; i <= count; i++) {
        [res addObject:@(i)];
    }

    // Shuffle the values - the greater the number of shuffles, the more randomized
    for (NSUInteger i = 0; i < count * 20; i++) {
        NSUInteger x = arc4random_uniform(count);
        NSUInteger y = arc4random_uniform(count);
        [res exchangeObjectAtIndex:x withObjectAtIndex:y];
    }

    return res;
}

// Apply the tags to the buttons. This assumes you have 10 separate ivars for the 10 buttons
NSArray *randomNumbers = [self generateRandomNumbers:10];
button1.tag = [randomNumbers[0] integerValue];
button2.tag = [randomNumbers[1] integerValue];
...
button10.tag = [randomNumbers[9] integerValue];
于 2013-03-02T23:07:26.520 に答える
1

@methは正しい考えを持っています。数字が繰り返されていないことを確認したい場合は、次のようにしてみてください:(注:topは生成する最大の数字です。これが=>量であることを確認してください。そうしないと、これは永遠にループします;)

- (NSArray*) makeNumbers: (NSInteger) amount withTopBound: (int) top
{ 
     NSMutableArray* temp = [[NSMutableArray alloc] initWithCapacity: amount];

     for (int i = 0; i < amount; i++)
     {
        // make random number
        NSNumber* randomNum; 

        // flag to check duplicates
        BOOL duplicate;

        // check if randomNum is already in your array
        do
        {
            duplicate = NO;
            randomNum = [NSNumber numberWithInt: arc4random() % top];

            for (NSNumber* currentNum in temp)
            {
                if ([randomNum isEqualToNumber: currentNum])
                {
                    // now we'll try to make a new number on the next pass
                    duplicate = YES;
                }
            }
        } while (duplicate)

        [temp addObject: randomNum];
    }

    return temp;
}
于 2013-03-02T22:29:51.710 に答える