3

乱数に関する 1 つの問題で立ち往生しています。を使用して乱数を生成してarc4random()います。最初は0から9までの乱数を生成したい。だから私は使用しています:

int RandomNumber = arc4random() % 9;

それは良いです。ここで、8 を取得したとします。新しい乱数を 8 にしたくないので、次のようにしました。

NSMutableArray *aryTemp = [NSMutableArray new];
for (int i = 0; i < [aryTemp Count] < 9; i++) {
   int RandomNumber;
   do {
      RandomNumber = arc4random() % 9;
   }
   while ([aryTemp containsObject:[NSNumber numberWithInt:RandomNumber]])
   [aryTemp addObject:[NSNumber numberWithInt:RandomNumber]];
}

したがって、これが以前に生成された乱数であるかどうかである次の乱数をチェックするよりも、配列に追加するよりも乱数を生成していますか? そうでない場合は、配列に追加します。

いくつかの開始番号に対しては正常に機能しますが、その時点でいくつかのオプションを残した場合、希望の乱数を生成する機会が非常に少なくなり、冗長な乱数のためにループプロセスに多くの時間がかかります.

私が探しているのは 0、1、2、3、4、5、6、7、8、9 の乱数が欲しい 最初に 6 を取得した場合、次回は乱数はこれらの数字に 0 のみである必要があります。 1、2、3、4、5、7、8、9

4

2 に答える 2

2

編集:上記のコメントにリンクされている回答は、よりエレガントなソリューションを提案しています-配列を適切にシャッフルしますが、私の単純なアプローチと同じプリンシパルを使用します:)

私があなたを正しく理解している場合:0〜9の範囲からすべてのアイテムをランダムに選択したいと考えています。

私の最初のアプローチは、範囲内のすべてのアイテムを含むバッグを作成することです. アイテムをランダムに選択するたびに、バッグから削除して、再度選択しないようにします。

次のコード スニペットは、これを実現する必要があります。

int randomNumber;

// Fill remainingNumbers array with numbers 0-9
NSMutableArray *remainingNumbers = [NSMutableArray array];
for (int i = 0; i < 10; i++) {
    [remainingNumbers addObject:[NSNumber numberWithInt:i]];
}

// Create tempNumbers array to store our random numbers in
NSMutableArray *tempNumbers = [NSMutableArray array];


for (int i = 0; i < 9; i++) {
    // Create a random number in the range of the indexs for remainingNumbers array
    int maxIndex = [remainingNumbers count] -1;
    randomNumber = arc4random() % maxIndex;

    // Add random number to tempNumbers array
    [tempNumbers addObject:[remainingNumbers objectAtIndex:randomNumber]];

    // Remove the number from the remaining numbers so we don't add duplicates
    [remainingNumbers removeObjectAtIndex:randomNumber];
}
// Add final number
[tempNumbers addObject:[remainingNumbers objectAtIndex:0]];


// Print the array of 'randomly selected numbers'
NSLog(@"The array is: %@", tempNumbers);
于 2013-03-28T12:18:11.133 に答える
0

これを試してください

//call method 
int tempvalue = (int) [self randomFloatBetween:0 secondParam:9]; // pass number as per your need


-(float) randomFloatBetween:(int) smallNumber secondParam:(float) bigNumber
{
    float diff = bigNumber - smallNumber;
    return (((float) rand() / RAND_MAX) * diff)
    + smallNumber;
}

これが役立つことを願っています、ありがとう。

ありがとうございました。ハッピーコーディング

于 2013-03-28T12:34:29.020 に答える