2012-09-18 157 views
1

我想生成一個介於1到10之間的隨機數。當用戶點擊「下一個」按鈕時,必須打印一個隨機問題並且問題不能重複。 問題是有時候問題在重複。 任何人都可以幫我或給一些參考或教程?生成1到10之間的隨機數而不重複

- (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; 
    } 
} 
+1

你忘了「break」在案例3 –

+1

看看這個:http://stackoverflow.com/questions/196017/unique-random-numbers-in-o1這也是:http://stackoverflow.com/questions/1608181/unique-random-numbers- in-an-integer-array-in-the-c-programming-language – Spynet

+1

你需要記住已經使用過的問題編號,沒有辦法繞過這個,afaik。 – martinstoeckli

回答

6

這個怎麼樣。

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

mutableArrayOfQuestions可以是「問題」的陣列(問題可能是模態的一個問題的類)或問題索引的簡單陣列。想法是隨機選擇mutableArrayOfQuestions中的問題,並將其刪除,以便下次不再選擇。

+0

mutableArrayOfQuestions在哪裏聲明? –

+0

已更新我的回答 – msk

+0

找不到namutablearray的屬性長度,我已經聲明瞭namutabllarray的屬性...我已經改變了數組的長度,但有時候會一次又一次地重複相同的數字。所以請幫助我 –

4

有一個更簡單的方法來做到這一點。
您可以簡單地創建一個NSMutableArray的10個號碼:

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

而且每次你​​需要一個隨機數,從數組中提取一個數隨機,並將其刪除:

int randomIndex= random()%[numbers size]; 
NSNumber* randomNumber=[numbers objectAtIndex: randomIndex]; 
[numbers removeObjectAtIndex: randomIndex]; 
0

在組10個問題,即使隨機選擇,您也可能會重複提問。每個問題都有10分之一的機會被選中,並且在真正的隨機選擇中,有可能再次選擇相同的問題。這是因爲您正在做的選擇是從容器中選擇項目,然後將其放回。

如果一個問題不能重複,那麼你需要做的是有一種機制,這樣當一個問題被使用時,它不會被放回到所選擇的問題集中。

所以,你需要修改代碼,以便您有問題數組,當選擇一個,這個問題從隨機選擇你產生一個隨機的問題,下一次取出。然後,一旦隨機選擇完成,您將刪除的問題放回到集合中,並刪除剛選擇的問題。

這意味着,您選擇的第一次,你會做1比10的隨機數。之後,它將始終是一個9比1的隨機數。

2

你想要什麼其實是一個置換。

理念1:

你有N個問題。 ķ問題不使用(0開頭) 算法:

  1. 生成隨機數r = arc4random() % (N - K)
  2. 找到Γ個未使用的問題。
  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); 
}
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; 
} 
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; 
    } 

那一些蹩腳的我產生,我想這個想法正是你需要=)

0

關注這個代碼

NSMutableIndexSet *indexSet = [NSMutableIndexSet new]; 

while ([indexSet count]<10) { 

int randomNumber = arc4random_uniform(11); 

    if(randomNumber!=0) 
    { 
     [indexSet addIndex:randomNumber]; 
    } 
}