0

ビンゴ アプリ用に一意の番号を生成しようとしていますが、現在は 1 ~ 90 の範囲で 90 個の乱数を選択し、それらを NSMutableSet に追加しています。それはすべて機能しますが、セットから選択された番号が一意であるため、同じ番号が2回引き出されます。

これが私がこれまでに持っているものです:

NSMutableSet * numberSet1 = [NSMutableSet setWithCapacity:90];
while ([numberSet1 count] < 90 ) {
    NSNumber * randomNumber1 = [NSNumber numberWithInt:(arc4random() % 90 + 1)];
    [numberSet1 addObject:randomNumber1];
}
//NSLog(@"numberWithSet : %@ \n\n",numberSet1);

NSArray * numbers = [numberSet1 allObjects];
//to display
int r = arc4random() % [numbers count];
if(r<[numbers count]){
    numberLabel.text = [NSString stringWithFormat:@"%@", [numbers objectAtIndex:r]];
}

重複を防ぐにはどうすればよいですか? 前もって感謝します

4

4 に答える 4

1

乱数を選択する代わりにarc4random()(これは replacement でサンプリングしますが、ビンゴ ゲームにはおそらく必要ありません):

  1. 1 から 90 までの数字の配列を取ります。
  2. その配列をシャッフルします。
  3. 配列から最初の番号を選択し、次に 2 番目、というように選択します。

配列内で現在選択されている要素のインデックスを保持します。次の番号を取得するには、90 番目の要素を逆参照しているかどうかをインクリメントして確認します。

いくつかの擬似コード:

#define SIZE 90

unsigned int index;
unsigned int elements[SIZE];

/* step 1 -- populate the array with elements 1 through 90 */
for (index = 0; index < SIZE; index++)
    elements[index] = index + 1;

/* step 2 -- shuffle the array */
fisher_yates_shuffle(elements);

/* step 3 -- read from the array */
for (index = 0; index < SIZE; index++)
    fprintf(stdout, "element at index %u is %u\n", index, elements[index]);
于 2012-11-19T22:36:18.040 に答える
0

NSMutableArray にカテゴリを作成する

@implementation NSMutableArray (RandomUtils)
-(void)shuffle
{
    NSUInteger count = [self count];
    for (NSUInteger i = 0; i < count; ++i) {
        NSUInteger nElements = count - i;
        NSUInteger n = (arc4random() % nElements) + i;
        [self exchangeObjectAtIndex:i withObjectAtIndex:n];
    }
}

@end

NSArray バージョン用にラップすることもできます

@implementation NSArray (RandomUtils)

-(NSMutableArray *)mutableArrayShuffled
{
    NSMutableArray *array = [[self mutableCopy] autorelease];
    [array shuffle];
    return array;
}

-(NSArray *)arrayShuffled
{
    return [NSArray arrayWithArray:[self mutableArrayShuffled]];
}

@end

必要に応じてカテゴリをインポートし、次の操作を行います。

NSMutableArray *array = [NSMutableArray array];
for(int i=0; i<90; i++){
    [array addObject:[NSNumber numberWithInt:i+1]];
}
[array shuffle];
NSArray *newarray = [array subarrayWithRange:NSMakeRange(0,6)];

別のアプローチは、6 つのランダムなピックでセットを埋めることです。

カテゴリ:

@implementation NSArray (RandomUtils)
-(id)randomElement
{
    if ([self count] < 1) return nil;
    NSUInteger randomIndex = arc4random() % [self count];
    return [self objectAtIndex:randomIndex];
}
@end

次のように使用します。

NSMutableSet *mset = [NSMutableSet set];

while ([mset count]<6) {
    [mset addObject:[array randomElement]];
} 
于 2012-11-20T00:30:52.370 に答える
0

少し前に書いた宝くじアプリから、ここにも当てはまります-

int ball[6], counter, check, similarity;
for ( counter = 1; counter <= 6; counter++ )
{
    for (;;)
    {
        similarity = 0;
        ball[counter] = 1 + arc4random() % 6;
        for (check = counter-1; check >= 1;check--)
        {
            if ( ball[check] == ball[counter] )
            {
                similarity = 1;
                break;
            }
        }
    if(similarity == 0)
        break;
    }
printf("%i\n", ball[counter]);
}

選択したボールを以前のすべてのボールと照合し、同じ数が 2 回得られることはありません。

于 2012-11-20T00:15:35.070 に答える
0

これにより、配列が作成され、シャッフルされます。

// array to shuffle
NSMutableArray *array = [NSMutableArray array];
for(int i=1; i<91; i++){
    [array addObject:[NSNumber numberWithInt:i]];
}

// shuffle
for (int i = [array count]-1; i>0; i--) {
    [array exchangeObjectAtIndex:i withObjectAtIndex:arc4random()%(i+1)];
}

1 から 90 までの 90 個の数字を重複なしでランダムに選択し、それらを変更可能なセットに追加することは、すべてを変更可能なセットに追加することと変わらないため、これが必要かどうかはわかりません。ただし、90 個の数値のサブセットが必要な場合は、配列から最大 n 個の要素を取得するだけです。

于 2012-11-19T23:09:15.697 に答える