1

0からtopOfRangeまでの乱数を生成しています。このコードでfirstNumberToExcludeを除外できます:

NSInteger aRandom;
while ((aRandom = arc4random()%topOfRange) == firstNumberToExclude);

除外する2つの数値(firstNumberToExcludeとsecondNumberToExclude)がある場合はどうでしょうか。これは私の計画でしたが、適切ではないようです。

NSInteger aRandom = arc4random()%topOfRange;
while (aRandom == firstNumberToExclude || aRandom == secondNumberToExclude)
    {
    aRandom = arc4random()%topOfRange;
    }
4

3 に答える 3

3

これをユーティリティメソッドにリファクタリングすると、コードがよりクリーンになり、保守が容易になると思います。

+ (NSInteger)generateRandomExcluding:(NSArray *)exclude topOfRange:(NSInteger)topOfRange {
    NSInteger aRandom = arc4random_uniform(topOfRange);
    while ([exclude containsObject:[NSNumber numberWithInteger:aRandom]]) {
        aRandom = arc4random_uniform(topOfRange);
    }
    return aRandom;
}

次に、次のように呼び出すことができます。

NSNumber *excludeOne = [NSNumber numberWithInt:5];
NSNumber *excludeTwo = [NSNumber numberWithInt:13];

NSInteger random = [MyClass generateRandomExcluding:[NSArray arrayWithObjects:excludeOne, excludeTwo, nil] topOfRange:100];
于 2012-11-11T16:39:24.647 に答える
0

これを試して:

NSInteger aRandom = arc4random()%topOfRange;
NSMutableArray *exludedNumbers = [NSMutableArray arrayWithObjects:
    [NSNumber numberWithInt: firstNumberToExclude],
    [NSNumber numberWithInt: secondNumberToExclude],
    nil];
BOOL flag = YES;
while (flag)
{
    flag = NO;
    for (NSNumber *numberToExclude in excludedNumbers)
    {
        if (numberToExclude.intValue == aRandom)
        {
            flag = YES;
            aRandom = arc4random()%topOfRange;
            break;
        }
    }
}

そのため、配列から除外する数値を動的に追加および削除できます

于 2012-11-11T16:31:42.997 に答える