1

I want to generate a random number between 1 and 10. When the user clicks on the “next” button then a random question must be printed and questions can not repeat. The problem is that sometimes the question is repeating. Can anyone help me or give some reference or tutorial?

- (IBAction)nextQuestion:(id)sender
{
    NSInteger randomNum = arc4random() %10 ;
    int countCounter= counter++;
    [self.btnNext setTitle:@"Next" forState:UIControlStateNormal];

    if(countCounter==4)
    {
        self.btnNext.hidden=YES;
        self.btnQuizDone.hidden=NO;
    }

    switch ( arc4random()%10) 
    {
      case 0:
      {
          NSLog(@"zero");

          [lblQuestion setText:@"Q10:question number ten"];

      }
      break;
     case 1:
      {
          NSLog(@"one");
          [lblQuestion setText:@"Q2:question number two"];

      }
      break;
      case 2:
      {
          NSLog(@"two");
          [lblQuestion setText:@"Q6:question number six"];

      }
      break;
      case 3:
      {
          NSLog(@"three");
          [lblQuestion setText:@"Q5:question  number five"];

      }
       break;
      case 4:
      {
          NSLog(@"four");
          [lblQuestion setText:@"Q3:question number three"];

      }
      break;
      case 5:
      {
          NSLog(@"five");
          [lblQuestion setText:@"Q9:question  number nine"];

      }
      break;
      case 6:
      {
          NSLog(@"six");
          [lblQuestion setText:@"Q7:question  number seven"];

      }
      break;
      case 7:
      {
          NSLog(@"seven");
          [lblQuestion setText:@"Q4:question  number four"];


      }
      break;
      case 8:
      {
          NSLog(@"eight");
          [lblQuestion setText:@"Q1:question  number one"];

      }
      break;
      case 9:
      {
          NSLog(@"nine");
          [lblQuestion setText:@"Q8:question  number eight"];

      }
      break;

      default:
          break;
    }
}
4

8 に答える 8

6

これはどう。

- (IBAction) getNextRandomQues:(id) sender
{
   int randomQuesIndex = (arc4random() % mutableArrayOfQuestions.count) + 1;
   [mutableArrayOfQuestions removeObjectAtIndex: randomQuesIndex];
}

mutableArrayOfQuestions は、「質問」の配列 (質問は質問をモーダルにするクラスである可能性があります) または質問インデックスの単純な配列です。mutableArrayOfQuestions から質問をランダムに選択して削除し、次回は選択されないようにすることを考えます。

于 2012-09-18T12:00:18.450 に答える
4

これを行うためのより簡単なアプローチがあります。
10個の数値のNSMutableArrayを作成するだけです。

NSMutableArray* numbers=[[NSMutableArray alloc]init];
for(int i=0; i<10; i++)
{
    [numbers addObject: [NSNumber numberWithInt: i]];
}

そして、乱数が必要になるたびに、配列からランダムに1つの数値を抽出し、それを削除します。

int randomIndex= random()%[numbers size];
NSNumber* randomNumber=[numbers objectAtIndex: randomIndex];
[numbers removeObjectAtIndex: randomIndex];
于 2012-09-18T12:02:47.977 に答える
2

あなたが望むのは、実際には順列です。

アイデア 1:

N 個の質問があります。K 個の質問は使用されません (最初は 0) アルゴリズム:

  1. 乱数を生成するr = arc4random() % (N - K)
  2. r 番目の未使用の質問を見つけます。
  3. この質問を使用済みとして登録し、K を減らします。

アイデア 2:

最初に質問のインデックスを生成します。

質問のインデックスint indices[] = {0, 1, 2, 3, ..., N};( の値から生成N)

インデックスをランダムにスワップ - ランダム順列を生成します。

for (int i = 0; i < 10 * N; i++) {
   int pos1 = arc4random() % N;
   int pos2 = arc4random() % N;

   swap(indices, pos1, pos2);
}
于 2012-09-18T12:07:21.333 に答える
1

スルサンが言ったように、しかしフィッシャー-イェーツシャッフルアルゴリズムを使用してください。

int i = N;
while (-- i) {
  int pos1 = arc4random() % (i + 1);
  swap(indices, pos1, i);
}

このアルゴリズムは、間違っている人にとっては悪名高いものです(http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.htmlを参照)。私はすでに上記を2回修正する必要がありましたが、それが正しいかどうかはまだわかりません。可能であれば、ライブラリのランダムシャッフルアルゴリズムを使用してください。

于 2012-09-18T13:13:32.943 に答える
0

このコードに従ってください

NSMutableIndexSet *indexSet = [NSMutableIndexSet new];

while ([indexSet count]<10) {

int randomNumber = arc4random_uniform(11);

   if(randomNumber!=0)
   {
       [indexSet addIndex:randomNumber];
   }
}
于 2012-09-18T13:02:35.817 に答える
0

10 の質問のセットでは、ランダムに選択した場合でも、質問が繰り返される可能性が非常に高くなります。各質問は 10 分の 1 の確率で選択され、真にランダムな選択では、同じ質問が再び選択される可能性があります。これは、実行している選択の種類が、コンテナーからアイテムを選択してから元に戻すものであるためです。

質問を繰り返してはならない場合は、質問が使用されたときに、選択が行われた一連の質問に戻されないように、何らかのメカニズムを用意する必要があります。

そのため、コードを変更して質問の配列を作成し、そのうちの 1 つを選択すると、次にランダムな質問を生成するときに、その質問がランダムな選択から削除されるようにする必要があります。次に、ランダムな選択が完了したら、削除した質問をセットに戻し、選択したばかりの質問を削除します。

これは、最初に選択するときに、10 分の 1 の乱数を行うことを意味します。その後は常に 9 分の 1 の乱数になります。

于 2012-09-18T12:05:43.783 に答える
0

これを行う:

-(NSMutableArray *)randomNumberGenrator:(NSMutableArray *)arrValues{

NSUInteger totalcount = [arrValues count];
for (NSUInteger i = 0; i < totalcount; ++i) 
 {
    // Select a random element between i and end of array to swap with.
    int nElements = totalcount - i;
    int n = (random() % nElements) + i;
    [arrValues exchangeObjectAtIndex:i withObjectAtIndex:n];
 }
 return arrValues;
}
于 2012-09-18T12:10:48.820 に答える
0
public int[] a = new int[10]{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

   public int onNextClickGetRandomQuestionNumber()
   {
       int k = arc4random()%10;



       if (!Exists(k,a))
       {
           for (int i = 0; i < a.Length; i++)
           {
               if (a[i] < 0)
               {
                   a[i] = k;
                   return i;
               }
           }

           for (int i = 0; i < a.Length; i++)
           {
               a[i] = -1;
           }
       }
       else
       {
           onNextClickGetRandomQuestionNumber();
       }

       return -1;


   }

    public  bool Exists(int parameter,int[] Massive)
    {
        for (int i = 0; i < Massive.Length; i++)
        {
            if( parameter == Massive[i])
            {
                return true;
            }
        }
        return false;
    }

それは私が生成したいくつかのくだらないものです。アイデアはまさにあなたが必要としているものだと思います =)

于 2012-09-18T12:56:15.290 に答える