0

現在クイズアプリを作成中です。ユーザーがクイズを開始すると、クイズ アプリに期待されるように、ランダムな質問が表示されます。問題は、完全にランダムではないことです。ランダムな質問が表示されますが、質問が繰り返されます。最後まで繰り返さないようにしたい!私のコードは次のとおりです。

int Questions = arc4random_uniform(142);
switch (Questions) {
    case 0:

        break;

    case 1:
        break;

(...)

それを行うためのより良い方法はありませんか?質問を繰り返さない方法は?どうもありがとう!

4

4 に答える 4

2

シャッフルが最善の解決策かもしれません:

// Setup
int questionCount = 10; // real number of questions
NSMutableArray *questionIndices = [NSMutableArray array];
for (int i = 0; i < questionCount; i++) {
    [questionIndices addObject:@(i)];
}
// shuffle
for (int i = questionCount - 1; i > 0; --i) {
    [questionIndices exchangeObjectAtIndex: i
        withObjectAtIndex: arc4random_uniform((uint32_t)i + 1)];
}
// Simulate asking all questions
for (int i = 0; i < questionCount; i++) {
    NSLog(@"questionIndex: %i", [questionIndices[i] intValue]);
}


NSLog output:
questionIndex: 6
questionIndex: 2
questionIndex: 4
questionIndex: 8
questionIndex: 3
questionIndex: 0
questionIndex: 1
questionIndex: 9
questionIndex: 7
questionIndex: 5

補遺

シャッフル後に実際のテキストが印刷される例

// Setup
NSMutableArray *question = [NSMutableArray arrayWithObjects:
    @"Q0 text", @"Q1 text", @"Q2 text", @"Q3 text", @"Q4 text",
    @"Q5 text", @"Q6 text", @"Q7 text", @"Q8 text", @"Q9 text", nil];
// shuffle
for (int i = (int)[question count] - 1; i > 0; --i) {
    [question exchangeObjectAtIndex: i
        withObjectAtIndex: arc4random_uniform((uint32_t)i + 1)];
}
// Simulate asking all questions
for (int i = 0; i < [question count]; i++) {
    printf("%s\n", [question[i] UTF8String]);
}

Sample output:
Q9 text
Q5 text
Q6 text
Q4 text
Q1 text
Q8 text
Q3 text
Q0 text
Q7 text
Q2 text
于 2013-11-09T22:22:22.477 に答える
1

すべての質問が使用されるまで、各質問を 1 回使用するという考え方です。

サンプルコード。questionIndex は繰り返されないことに注意してください。

// Setup
int questionCount = 10; // real number of questions
NSMutableArray *questionIndexes = [NSMutableArray array];
for (int i=0; i<questionCount; i++)
    [questionIndexes addObject:@(i)];

// Simulate asking all questions
while (questionIndexes.count) {
    // For each round 
    unsigned long arrayIndex = arc4random_uniform((uint32_t)questionIndexes.count);
    int questionIndex = [questionIndexes[arrayIndex] intValue];
    [questionIndexes removeObjectAtIndex:arrayIndex];
    NSLog(@"arrayIndex: %lu, questionIndex: %i", arrayIndex, questionIndex);
}

NSLog 出力:
arrayIndex: 9、questionIndex: 9
arrayIndex: 5、questionIndex: 5
arrayIndex: 5、questionIndex: 6
arrayIndex: 3、questionIndex: 3
arrayIndex: 3、questionIndex: 4
arrayIndex: 4、questionIndex: 8
arrayIndex: 2、questionIndex : 2
arrayIndex: 0、questionIndex: 0
arrayIndex: 1、questionIndex: 7
arrayIndex: 0、questionIndex: 1

于 2013-11-09T21:22:07.283 に答える
0

乱数発生器は実際には疑似乱数です。デフォルトでは、同じ初期値から開始されます。それを「本当のランダム」にするには、実行ごとに一意の開始値、つまり「ソルト」を指定する必要があります。最も簡単な方法として、[NSDate timeIntervalSinceReferenceDate] を使用できます。

于 2013-11-09T19:29:57.793 に答える
0

質問を配列に入れ、乱数を のobjectWithIndexメソッドに入れますNSMutableArray。次に、配列から質問を削除します。インデックスが選択されたが、質問がなくなった場合はいつでも、もう一度試してください。

于 2013-11-09T19:34:28.537 に答える