1

重複の可能性:
繰り返さない乱数の生成

これが私のコードです

NSUInteger count = 10;
for (NSUInteger i = 0; i < count; ++i) {
    NSLog(@"%d",NeedRandomNumberWithoutRepeat);
}

この出力は 8 7 9 2 1 4 6 3 5 0 のようになるはずです。これはランダムであり、数字を繰り返しません

4

3 に答える 3

1

これはうまくいくはずです:

NSUInteger count = 10;

NSMutableArray *array = [[NSMutableArray alloc]init];
for (NSUInteger i = 0; i < count; ++i) {
    [array addObject:[NSNumber numberWithInt:i]];
}

NSMutableArray *copy = [array mutableCopy];
array = [[NSMutableArray alloc]init];
while ([copy count] > 0)
{
    int index = arc4random() % [copy count];
    id objectToMove = [copy objectAtIndex:index];
    [array addObject:objectToMove];
    [copy removeObjectAtIndex:index];
}
于 2012-12-14T13:27:53.960 に答える
0

この回答は、SOの私の回答の 1 つから修正されたバージョンです。

したがって、ここで何か奇妙なことがわかるかもしれませんが、要件が似ているため、これを使用できます。

int TOTAL_NUMBER=10;
NSMutableArray *alreadyGeneratedNumbers;


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{
    alreadyGeneratedNumbers=[NSMutableArray new];
}

-(int)generateRandomNumber{
    int low_bound = 0;
    int high_bound = TOTAL_NUMBER;
    int width = high_bound - low_bound;
    int randomNumber = low_bound + arc4random() % width;

    return randomNumber;
}

- (IBAction)button:(id)sender {
    NSMutableArray *shuffle = [[NSMutableArray alloc] initWithCapacity:1];

    BOOL contains=YES;
    while ([shuffle count]<1) {
        NSNumber *generatedNumber=[NSNumber numberWithInt:[self generateRandomNumber]];

        if (![alreadyGeneratedNumbers containsObject:generatedNumber]) {
            [shuffle addObject:generatedNumber];
            contains=NO;
            [alreadyGeneratedNumbers addObject:generatedNumber];
        }
    }

    NSLog(@"shuffle %@",shuffle);
    NSLog(@"Next Batch");

    if ([alreadyGeneratedNumbers count] >= TOTAL_NUMBER) {
        NSLog(@"\nGame over, Want to play once again?");//or similar kind of thing.
        [alreadyGeneratedNumbers removeAllObjects];
    }
}
于 2012-12-14T13:54:20.073 に答える
-1

利用可能な数値を配列に入れ、arc4random() で計算された 0 から配列のサイズ -1 までのインデックスを取得します。数値が出てきたら、配列からそれを取り除きます。

NSMutableArray* availableNumbers=[NSMutableArray new];
for(NSUInteger i=0; i<10; i++)
{
    [availableNumbers addObject: @(i)];
}
for(NSUInteger i=0; i<10; i++)
{
    NSUInteger index= arc4random()%availableNumbers.count;
    NSNumber* number= availableNumbers[index];
    NSLog(@"%@",number);
    [availableNumbers removeObjectAtIndex: index];
}

PS: 内部に 1 つの数値しかないため、最後の反復で arc4random() を訴えても意味がありません。

于 2012-12-14T13:57:29.007 に答える