0

ボタンにランダムなテキストを表示することができたので、配列内のアイテムがほとんどの場合に繰り返されることに気付きました。そのため、「abc d」や「acd b」ではなく、「abb b」や「acb c」のようなものが得られます。for ループに、既に使用されている配列値のインデックスを除外して、何も繰り返さないようにするにはどうすればよいですか?

また、クイズの質問ごとに配列リストを作成する必要がないように、配列内のすべての値ではなく特定の値から選択するように for ループに指示するにはどうすればよいでしょうか? 配列に [abcdefg] がある場合と同様に、質問 1 で [abce] のみをランダムな順序で表示します。

現在のコードは次のようになります。

answerList = [[NSMutableArray alloc] initWithObjects:
"a", "b", "c", "d", "e", "f", "g", nil];
    for (int j=0; j<answerList.count; j++)
{
    int k = arc4random() % [answerList count];
    [btnA setTitle:[answerList objectAtIndex:k] forState:UIControlStateNormal];
    [answerList removeObjectAtIndex:k];
    int l = arc4random() % [answerList count];
    [btnB setTitle:[answerList objectAtIndex:l] forState:UIControlStateNormal];
    [answerList removeObjectAtIndex:l];
    int m = arc4random() % [answerList count];
    [btnC setTitle:[answerList objectAtIndex:m]  forState:UIControlStateNormal];
    [answerList removeObjectAtIndex:m];
    int n = arc4random() % [answerList count];
    [btnD setTitle:[answerList objectAtIndex:n] forState:UIControlStateNormal];
    [answerList removeObjectAtIndex:n]; }
4

4 に答える 4

5

問題をシャッフル問題に変換するだけです。

Fisher–Yates シャッフル アルゴリズムを使用して、配列をシャッフルできます。

answerList = [[NSMutableArray alloc] initWithObjects:@"a", @"b", @"c", @"d", @"e", @"f", @"g", nil];
for (int i = answerList.count - 1; i >= 0; --i) {
    int r = arc4random_uniform(answerList.count);
    [answerList exchangeObjectAtIndex:i withObjectAtIndex:r];
}

次に、そこから最初の n 個のオブジェクトを取得します。元の配列から n 個のランダムな一意の要素を取得します。

[btnA setTitle:answerList[0] forState:UIControlStateNormal];
[btnB setTitle:answerList[1] forState:UIControlStateNormal];
[btnC setTitle:answerList[2] forState:UIControlStateNormal];
[btnD setTitle:answerList[3] forState:UIControlStateNormal];
于 2013-01-21T05:19:56.620 に答える
3

これを試して、

int random;

NSString *currentText;

nonrepeatingArray = [[NSMutableArray alloc] init];

buttonArray = [[NSMutableArray alloc] initWithObjects:btnA, btnB, btnC, btnD, btnE, btnF, btnG, nil];

answerList = [[NSMutableArray alloc] initWithObjects:"a", "b", "c", "d", "e", "f", "g", nil];

for (int j=0; j<answerList.count; j++)
{
    do {
          random = arc4random()%answerList.count;
          currentText = [answerList objectAtIndex:random];
       } while ([nonrepeatingArray containsObject:currentText]);

    [nonrepeatingArray addObject:currentText];

    UIButton *button = (UIButton *)[buttonArray objectAtIndex:j];

    NSString *title = [answerList objectAtIndex:random];

    [button setTitle:title forState:UIControlStateNormal];  
}
于 2013-01-21T04:25:12.397 に答える
1

whileこれは悪い考えのように、ランダムな結果が有効かどうかをテストするために使用されます。理論的には、乱数の文字列により長時間 CPU ロックが発生する可能性がありますが、可能性は低いです。回答ごとに 1 回だけループを繰り返すことができれば、はるかに優れています。

代わりに、配列のコピーを作成して、次の項目を選択する前に使用した項目を削除してください。

// master answer list
answerList = [[NSMutableArray alloc] initWithObjects:@"a", @"b", @"c", @"d", @"e", @"f", @"g", nil];

// make a copy we can delete from
NSMutableArray *unusedAnswerList = [answerList mutableCopy];

// loop until they are all gone
while([unusedAnswerList count] > 0)
    // get a random index
    int index = arc4random()%[unusedAnswerList count];

    // pull out the value at the random index
    NSString *title = [unusedAnswerList objectAtIndex:index];

    // remove the value we just grabbed.
    [unusedAnswerList removeObjectAtIndex:index];

    // do somehting with the value we jsut grabbed
    [btnA setTitle:title forState:UIControlStateNormal];
    [btnB setTitle:title forState:UIControlStateNormal];
    [btnC setTitle:title forState:UIControlStateNormal];
    [btnD setTitle:title forState:UIControlStateNormal];
}
于 2013-01-21T03:01:43.587 に答える
0
    numberArray = [[NSMutableArray alloc]initWithCapacity:0];
    for(int i=1;i<=20;i++)
    {
        [numberArray addObject:[NSNumber numberWithInt:i]];
    }





   for (int i = 0;i<[numberArray count];i++,i--,k++)  {
        srand(time(NULL));
        a = rand()%[numberArray count];
        //NSLog(@"a Value :%@",[numberArray objectAtIndex:a]);
        tempStr1 = [numberArray objectAtIndex:a];
        [numberArray removeObjectAtIndex:a];
        b=rand()%[numberArray count];
        //NSLog(@"b VAlue :%@",[numberArray objectAtIndex:b]);
        tempStr2 = [numberArray objectAtIndex:b];
        [numberArray removeObjectAtIndex:b];

        c = rand()%[numberArray count];
        //NSLog(@"a Value :%@",[numberArray objectAtIndex:a]);
        tempStr3 = [numberArray objectAtIndex:c];
        [numberArray removeObjectAtIndex:c];
        d=rand()%[numberArray count];
        //NSLog(@"b VAlue :%@",[numberArray objectAtIndex:b]);
        tempStr4 = [numberArray objectAtIndex:d];
        [numberArray removeObjectAtIndex:d]; }
于 2013-01-21T05:13:12.220 に答える