0

私のアプリでは、最初にスタートボタンが表示されます。「スタート」を押すと、アプリはint fraga1-fraga40を0から23の間でランダム化します(これは質問として使用されます)。fraga1とfraga12を同じにすることはできません。fraga13とfraga22を同じにすることはできません。fraga23とfraga28を同じにすることはできません。fraga29とfraga40を同じにすることはできません。

その後、しばらくすると、別の開始ボタンが表示されます。これを押すと、fraga41-fraga81が0から23の間でランダム化されます。fraga41からfraga52を同じにすることはできません。」fraga53からfraga62を同じにすることはできません。 。fraga63とfraga68を同じにすることはできません。fraga69とfraga80を同じにすることはできません。

ただし、スタートボタンを2回クリックすると、ボタンは「クリック」されたまま(または「強調表示」)になり、アプリシミュレーターがフリーズします。

私はこのようなコードを使用しています...

 -(void) v1
 {
     fraga1=arc4random()%24;
    [self v2];
  }
  -(void) v2

 {
      fraga2=arc4random()%24;
      if(fraga2==fraga1)
       {
         [self v2];
      }
      [self v3];
  }
 -(void) v3
 {
      fraga3=arc4random()%24;
     if(fraga3==fraga2||fraga3==fraga1)
     {
         [self v3];
     }
           [self v4];
     }

最初のボタンから40まで、そして他のボタンからv41からv80まで!

私はこれを修正できると思いますか?質問をランダム化するための戦略を変更する必要がありますか?

30の数字のようにランダムになるように変更しようとしましたが、それでも同じです。各質問で100の数字のようにしようとすると、動作しますが、少し遅いです。

前もって感謝します!

/ a noob

編集:私はこれを行いましたが、すべてのフラガは0に設定されています:

void fillUniqueRand(uint32_t arr[], uint32_t l, uint32_t n)

{uint32_t in、il = 0;

for(in = 0; in < n && il < l; ++in)
{
    uint32_t rn = n - in;
    uint32_t rl = l - il;
    if(arc4random() % rn < rl)
        arr[il++] = in;
}

//We now have random numbers in order and
//need to shuffle them
uint32_t j, tmp;
for(uint32_t i = l - 1; i > 0; i--)
{
    j = arc4random() % (i + 1);
    tmp = arr[i];
    arr[i] = arr[j];
    arr[j] = tmp;
}

} //メソッドからこれを呼び出す-(void)vnr {uint32_t fraga1、fraga2、fraga3、fraga4、fraga5、fraga6、fraga7、fraga8、fraga9、fraga10、fraga11、fraga12、fraga13、fraga14、fraga15、fraga16、fraga17、fraga18 、fraga19、fraga20、fraga21、fraga22、// ... fraga23、fraga24、fraga25、fraga26、fraga27、fraga28、fraga29、fraga30、fraga31、fraga32、fraga33、fraga34、fraga35、fraga36、fraga37、fraga38、fraga39、fraga40; //、...;

//Max fraga range I noticed was 12
uint32_t unique[12] = { 0 };
fillUniqueRand(unique, 12u, 24u);

fraga1 = unique[0];
fraga2 = unique[1];
fraga3 = unique[2];
fraga4 = unique[3];
fraga5 = unique[4];
fraga6 = unique[5];
fraga7 = unique[6];
fraga8 = unique[7];
fraga9 = unique[8];
fraga10 = unique[9];
fraga11 = unique[10];
fraga12 = unique[11];
//...
fillUniqueRand(unique, 10, 24u);

fraga13 = unique[0];
fraga14 = unique[1];
fraga15 = unique[2];
fraga16 = unique[3];
fraga17 = unique[4];
fraga18 = unique[5];
fraga19 = unique[6];
fraga20 = unique[7];
fraga21 = unique[8];
fraga22 = unique[9];
//Only 6 elements between fraga23-fraga28
fillUniqueRand(unique, 6, 21u);

fraga23 = unique[0];
fraga24 = unique[1];
fraga25 = unique[2];
fraga26 = unique[3];
fraga27 = unique[4];
fraga28 = unique[5];

fillUniqueRand(unique, 12u, 24u);

fraga29 = unique[0];
fraga30 = unique[1];
fraga31 = unique[2];
fraga32 = unique[3];
fraga33 = unique[4];
fraga34 = unique[5];
fraga35 = unique[6];
fraga36 = unique[7];
fraga37 = unique[8];
fraga38 = unique[9];
fraga39 = unique[10];
fraga40 = unique[11];
//...
//You get the picture

}

4

2 に答える 2

1

C プログラミング言語の整数配列内の一意の乱数への回答に基づいて、より効率的なアルゴリズムを実装して、無限ループに陥らず、範囲の終わりに向かって高価な計算時間を回避する必要があります。これは、あなたのために働くかもしれない実装の例です。

/*!
 @param arr Array to be filled with unique random numbers
 @param l Number of elements to fill in the array
 @param n The max of range the random number
    (if there is a minimum range then just add it to each resulting arr index)
 */
void fillUniqueRand(uint32_t arr[], uint32_t l, uint32_t n)
{
    uint32_t in, il = 0;

    for(in = 0; in < n && il < l; ++in)
    {
        uint32_t rn = n - in;
        uint32_t rl = l - il;
        if(arc4random() % rn < rl)
            arr[il++] = in;
    }

    //We now have random numbers in order and
    //need to shuffle them
    uint32_t j, tmp;
    for(uint32_t i = l - 1; i > 0; i--)
    {
        j = arc4random() % (i + 1);
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

//Calling this from a method
-(void) v1
{
    uint32_t 
        fraga1, fraga2, fraga3, //...
        fraga23, fraga24, fraga25 //,...
    ;

    //Max fraga range I noticed was 12
    uint32_t unique[12] = { 0 };
    fillUniqueRand(unique, 12u, 24u);

    //fill fraga1 - fraga12
    fraga1 = unique[0];
    fraga2 = unique[1];
    fraga3 = unique[2];
    //...

    //Only 6 elements between fraga23-fraga28
    fillUniqueRand(unique, 6, 24u);

    //fill fraga23 - fraga28
    fraga23 = unique[0];
    fraga24 = unique[1];
    fraga25 = unique[2];
    //...
    //You get the picture
 }
于 2012-05-15T19:29:19.763 に答える
0

可変配列を使用して整数fragaXYを操作することをお勧めします。整数を配列に直接追加することはできませんが、これを行った後に追加できます。

[myArray addObject:[NSNumber numberWithInt:fragaXY]];

したがって、配列から始めて、乱数を完全に入力し(進行中に乱数を生成するのではなく)、一致する数値を修正し、 for ループを使用することをお勧めします

NSMutableArray *myArray = [[NSMutableArray alloc] initWithCapacity:80];

for (int i=0;i<80;i++) {
[myArray addObject:[NSNumber numberWithInt:(arc4random%24)]];
}

それが完了したら、要件が満たされているかどうかを確認するために、次のように記述できます。

if([myArray objectAtIndex:0].intValue != [myArray objectAtIndex:11].intValue) {

//checking if they fraga1 is different than fraga12 and so on... here you can change one of the values..

}

これにより、コードがよりクリーンになります。

于 2012-05-15T18:24:00.223 に答える