3

繰り返しなしで乱数を生成したいクイズアプリを作っています。
私は多くのことを検索してアイデアを得ましたが、私は何か間違ったことをしていると思います。それが正しい出力を取得しない理由です。

これが私が使用したコードです。

-(int)generater{

NSMutableArray *temp;
srand([[NSDate date] timeIntervalSince1970]);
r = 1 + (arc4random() % 11);

if ([temp count] ==0) {

    [temp addObject:[NSNumber numberWithInteger:questionnumber]];
    return r;

}
if ([temp count] >= 1 ){

    if (![temp containsObject:[NSNumber numberWithInteger:questionnumber]]) {

        return r;

    }
    else{

        int next=[self generater];
        return next;
    }
}
return r;
}  

次の質問については、

-(void)askQuestion{

[self generater];

questionnumber = r;

NSInteger row = 0;
if(questionnumber == 1)
{
    row = questionnumber - 1;
}
else
{
    row = ((questionnumber - 1) * 11);
}

誰かが私が間違っているところを私に提案できますか?

4

6 に答える 6

4
    arryRandomNumber=[[NSMutableArray alloc]init];
    while (arryRandomNumber.count<12) {
    NSInteger randomNumber=1+arc4random()%12;
    if (![arryRandomNumber containsObject:[NSString stringWithFormat:@"%d",randomNumber]])       {
          [arryRandomNumber addObject:[NSString stringWithFormat:@"%d",randomNumber]];
     }
         continue;
    }
     NSLog(@"%@",arryRandomNumber);
于 2012-12-21T11:41:59.150 に答える
3

確かに最善の方法は、すべての質問 (または質問番号) を順番に配列に入れてからシャッフルすることです。

NSMutableArray をシャッフルする最良の方法を参照してください。

いくつかの追加のガイダンス (NB すべてのコードはブラウザーで記述され、実際にはコンパイルおよびテストされていません。ただし、それでも要点を理解する必要があります):

1) ivar を設定しNSMutableArray *randomQuestionNumbersます。質問の数で配列の内容を初期化するため、5 つの質問がある場合は 1 ~ 5 の数字を入力します。手動で行うには、次のようにします。

randomQuestionNumbers = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:2], [NSNumber numberWithInt:3], [NSNumber numberWithInt:4], [NSNumber numberWithInt:5], nil];

2) その後、上記のリンクにある方法のいずれかを使用して、シャッフルする必要があります。これにより、[1,2,3,4,5] -> [4,1,5,3,2] が変換されます。たとえば、3) 次の質問番号を取得するメソッドを作成します。

- (NSInteger) nextQuestionNumber {

  NSInteger nextQuestionNumber = -1;
  if ([randomQuestionNumbers count] > 0) {
      nextQuestionNumber = (NSInteger) [randomQuestionNumbers objectAtIndex:0];
      [randomQuestionNumbers removeObjectAtIndex:0];
  }
  return nextQuestionNumber;
}

ここで起こっていることは、配列の最初の int を取得することです。次に、その要素を配列から削除します。最後に、4 などの int を返します。次にメソッドが呼び出されると、要素が 1 つ少なくなり、最初の要素は int 1 などになります。配列が空であることを示すために -1 をかなり大雑把に使用していますが、正直に言うと、メソッドを必要以上に呼び出さないようにすることができるはずです。

于 2012-05-11T08:35:21.853 に答える
1

このコードがお役に立てば幸いです...

ここでは、要件によって制限を設定する必要があります。

このコードの利点は、既に取得した同じ乱数を繰り返さないことです。(重複する番号はありません)

srand(time(NULL));

int randomIndex = rand() % limit;

[reportIDTextField setText:[NSString stringWithFormat:@"%i", randomIndex]];

コーディングをお楽しみください :)

于 2012-05-13T07:48:24.490 に答える
1

2 つの数値間の乱数法:

- (int)randomFromSmallest: (int) smallest toLargest: (int) largest
{
    int random = smallest + arc4random() % (largest + 1 - smallest);
    return random;
}

そして、それが私が繰り返さない数字の配列を埋める方法です:

NSMutableArray *randNrArray = [[NSMutableArray alloc] init];

while ([randNrArray count] < 25)
{
    int rndNumber = [self randomFromSmallest:0 toLargest:25 - 1];

    if (![randNrArray containsObject:[NSNumber numberWithInt:rndNumber]])
    {
        [randNrArray addObject:[NSNumber numberWithInt:rndNumber]];
        //NSLog(@"___ %d ___", rndNumber);
    }
}

これが役立つことを願っています。

于 2014-09-09T10:30:37.617 に答える
0

すべての質問番号をNSMutableArray(1, 2, 3, 4, 5, 6, 7, 8) に入れてから、この配列でいくつかの順列を実行します。

このアプローチを使用して、テンキーパッドをスクランブルします。

// Randomize keys: exchange two random keys, ten times.
for (int i = 0; i < 10; i++)
{
    int a = 0, b = 0;
    while (a == b)
    {
        a = arc4random() % 10;
        b = arc4random() % 10;
    }
    UIButton *btnA = (UIButton *)[_scrambledKeypad viewWithTag:a + 10];
    UIButton *btnB = (UIButton *)[_scrambledKeypad viewWithTag:b + 10];
    CGRect frame = btnA.frame;
    btnA.frame = btnB.frame;
    btnB.frame = frame;
}
于 2012-05-11T08:34:51.303 に答える
0

多分: r = [自己発生器];

questionnumber = r;
于 2012-05-11T08:35:06.620 に答える