0

配列内の各文字が異なる 6 種類の文字のうち 4 種類で配列を埋めようとしています。配列に配置される文字は、switch ステートメントに基づいています。次に、配列に戻って、配置したばかりの文字がまだ配列にないことを確認し、そうである場合は別の文字を入力する必要があります。どうすればいいですか?アレイ全体を補充するのではなく、この 1 か所だけを補充します。

これは私がこれまでに持っているコードで、コメントが含まれています:

-(void) fillarray{

for (int i=0; i<4; i++)
{
    int randomNum = arc4random() % 6; // generates a random number

          switch (randomNum) // based on the number generated, it choses what color will be placed into the slot
    {
        case 1:
            colorarray[i] ='r';
            break;

        case 2:
            colorarray[i] ='o';
            break;

        case 3:
            colorarray[i] ='y';
            break;

        case 4:
            colorarray[i] ='g';
            break;
        case 5:
            colorarray[i] = 'b';

        case 6:
            colorarray[i] = 'p';

        default:
            break;
    }

    for (int j=0; j<4; j++) // runs through the array to ensure that the recently placed color does not match previous placed colors
    {
        while (j /= i)

            if (colorarray[i]==colorarray[j]) // if the color is already in the array
                                            //try again to place another color in this location

    }
4

5 に答える 5

1

Fisher-Yates シャッフル アルゴリズムに基づいて、これを使用します。

NSArray * array = @[ @"r", @"o", @"y", @"g", @"b", @"p" ] ;
array = [ [ array shuffledArray ] subarrayWithRange:(NSRange){ .length = 4 } ] ;

NSArray に追加される場所-shuffledArray:

@implementation NSArray ( Shuffling )

-(NSArray*)shuffledArray
{
    NSMutableArray * result = [ NSMutableArray arrayWithCapacity:self.count ] ;
    [ result addObject:self[0] ] ;
    for( NSUInteger index=1, count = self.count; index < count; ++index )
    {
        int j = arc4random_uniform( (unsigned int)index ) ;
        [ result addObject:result[j] ] ;
        [ result replaceObjectAtIndex:j withObject:self[ index ] ] ;
    }

    return result ;
}

@end
于 2012-09-29T01:09:18.650 に答える
1

まず、抽出できるすべての文字の配列を取得します (NSArray を使用することもできます。ここでは、C スタイルの配列を使用することをお勧めします)。

char characters[]={'r','o','y','g','b','p'};
int length=6;

次に、文字を抽出するたびに長さ変数を減らし、抽出された最後の文字を最後の文字と交換して、それが再び使用されないようにします。

int randomNum = arc4random() % length;
< put characters[randomNum] somewhere>
char temp=characters[randomNum];
characters[randomNum]=characters[length-1];
characters[length-1]=temp;
length--;    

PS: % オペランドは商の余りを返します。そのため、数値 % N が N になることはありません。範囲は 0 から N-1 です。

于 2012-09-28T19:37:16.397 に答える
0

配列をシャッフルする別の方法を次に示します (ランダムな上位 X 要素を取得するため)。基本的に、Ramy Alzury と nielsbot が応答したことを行います。アルゴリズムは次のようになります。

Do this 10 times the length of the array
    swap the last element with a random element chosen from the array

最後に、これはランダムにシャッフルされた配列を生成するはずです(10回シャッフルしています)

Objective C のサンプル関数を次に示します。

-(NSArray *) shuffleArray:(NSArray *) arr{
    NSMutableArray * mArr = [NSMutableArray arrayWithArray:arr];
    for(int i=0;i<arr.count*10;i++){
        int num = arc4random()%arr.count;
        NSString * temp = (NSString *)[mArr objectAtIndex:arr.count-1];
        [mArr replaceObjectAtIndex: arr.count-1 withObject:[mArr objectAtIndex:num]]; 
        [mArr replaceObjectAtIndex:num withObject:temp];
    }
    return [NSArray arrayWithArray:mArr];
}
于 2012-10-02T03:25:48.950 に答える
0

関数は次のようになります。

    int found = 1;
    for (int i=0; i<4; i++)
    {
        while(found) {
           int randomNum = arc4random() % 6;
           switch (randomNum) 
           {
              case 1:
                colorarray[i] ='r';
                break;

              case 2:
                colorarray[i] ='o';
                break;

             case 3:
               colorarray[i] ='y';
               break;

             case 4:
               colorarray[i] ='g';
               break;
             case 5:
               colorarray[i] = 'b';
               break;

             case 6:
               colorarray[i] = 'p';

             default:
               break;
           }
           found = 0;
           for (int j = i-1; i >= 0; j--) {
              if (colorarray[i] == colorarray[j])
                 found = 1;
           }
        }
 }
于 2012-09-28T19:36:56.597 に答える
0

また、スイッチを使用したくない場合、または (本質的に) 長さ変数をデクリメントして配列から受け取った文字を削除したくない場合は、いつでもこれを行うことができます。

char colorarray[5] = {0,0,0,0,'\0'};
char possibleCharacters[6] = {'r', 'o', 'y', 'g', 'b', 'p'};
BOOL isNotUnique = NO;

for(int i = 0; i < 4; i++){
    do{
        colorarray[i] = possibleCharacters[arc4random() % 6];
        for(int j = i - 1; j > -1; --j){
            if(colorarray[i] == colorarray[j]){
                isNotUnique = YES;
                break;
            }
            else isNotUnique = NO;
        }
    }while(isNotUnique);
}

NSLog(@"%s", colorarray);

基本的に文字を取得するための実際のループは次のとおりです。

1    for each spot in the colors arrays
2        generate a random number and use it to get a character
3        check to see if the character is identical to any spot before this one
4        if our new character matched any previous one, repeat from 2 on
于 2012-09-28T20:09:52.697 に答える