2012-05-15 83 views
0

在我的應用程序,你會得到一個啓動按鈕第一,當你點擊「開始」,應用程序將隨機0到23之間的整數fraga1-fraga40(這將被用作問題)。 fraga1到fraga12不能相同。 fraga1到fraga12不能相同。 fraga13到fraga22不能是相同的。 fraga23到fraga28的 不能相同。 fraga29與fraga40不能相同。 fraga29與fraga40不能相同。模擬器凍結在arc4random法

然後過了一段時間,你就會得到一個啓動按鈕..當你按下一個,fraga41-fraga81將隨機23.介於0和 fraga41到fraga52不能成爲same.`` fraga53到fraga62不能相同。 fraga63到fraga68不能相同。 fraga69到fraga80的 不能相同。

但是當你點擊開始按鈕,第二次,按鍵則保持「點擊」(或「突出」)和應用程序模擬器凍結。

我用這樣的代碼...

-(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號上的每個問題..它的工作原理,但那種慢!

在此先感謝!

/一個小白

編輯: 我這樣做,但每弗拉加被設置爲0:

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

{ uint32_t的中,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; 
} 

} //從一個方法 調用此 - (無效)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 

}

+0

1.是改變你的策略2.如果暫停時就停止在哪一行調試器? – Joe

+0

我看不到它是什麼行:O或者我怎麼能看到它? :O – Mangy92

+0

你能推薦一個策略嗎?我會很高興! :) – Mangy92

回答

1

基於對Unique random numbers in an integer array in the C programming language的回答,您應該實施更高效的算法,以便最終不會陷入無限循環,並避免在範圍末尾花費昂貴的計算時間。以下是可能適用於您的實施示例。

/*! 
@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 
} 
+0

謝謝!我試圖改變你的方法,但每個fragas都設置爲0!我在上面的問題中編寫了我的代碼! :) – Mangy92

+0

我絕對測試過它,它運行良好,每次調用'fillUniqueRand'' unique'應該包含隨機數字。 – Joe

+0

嗯,似乎每個fraga在(void)v1中的uint32_t之後都不是「綠色」。所以我想它由於某種原因找不到它們! 無論如何,所以例如fraga41將在fraga1-fraga12的第一個filluniquerand?像這樣fraga41 =獨一無二[13]對不對? :) – Mangy92

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.. 

} 

這將使您的代碼更清潔。

相關問題