生成1到10之间的随机数,不重复

时间:2012-09-18 11:56:03

标签: iphone objective-c random

我想生成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;
    }
}

8 个答案:

答案 0 :(得分:6)

这个怎么样。

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

mutableArrayOfQuestions可以是“问题”数组(问题可以是模拟问题的类)或简单的问题索引数组。想法是随机选择mutableArrayOfQuestions中的问题并将其删除,以便下次不再选择它。

答案 1 :(得分:4)

有一种更简单的方法可以做到这一点 您只需创建一个包含10个数字的NSMutableArray:

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];

答案 2 :(得分:2)

你想要的实际上是一种排列。

想法1:

你有N个问题。不使用K个问题(开头为0) 算法:

  1. 生成随机数r = arc4random() % (N - K)
  2. 找到第r个未使用的问题。
  3. 将此问题注册为使用,减少K。
  4. 想法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);
    }

答案 3 :(得分:1)

像Sulthan所说,但使用Fisher-Yates shuffle算法。

int i = N;
while (-- i) {
  int pos1 = arc4random() % (i + 1);
  swap(indices, pos1, i);
}

这种算法因人们弄错而臭名昭着(见http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html)。我已经不得不两次修复上面的内容了,我仍然不确定它是对的!如果可能的话,使用库中的随机混洗算法。

答案 4 :(得分:0)

在一组10个问题中,即使随机选择,你也可能会重复一个问题。每个问题都有十分之一的机会被选中,并且在真正的随机选择中,有可能再次选择相同的问题。这是因为您正在进行的选择是从容器中选择项目然后将其放回的选项。

如果一个问题不能重复,那么你需要做的是建立某种机制,以便在使用问题时,不会将其放回到进行选择的问题集中。

因此,您需要修改代码,以便有一系列问题,当选择一个问题时,下次生成随机问题时,该问题将从随机选择中删除。然后,一旦完成随机选择,您就将删除的问题放回集合中并删除刚刚选择的问题。

这意味着您第一次选择时,将使用10进制随机数。之后,它将始终是一个1/9的随机数。

答案 5 :(得分: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;
}

答案 6 :(得分: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;
    }

那是我生成的一些蹩脚的,我想这个想法正是你需要=)

答案 7 :(得分:0)

请遵循此代码

NSMutableIndexSet *indexSet = [NSMutableIndexSet new];

while ([indexSet count]<10) {

int randomNumber = arc4random_uniform(11);

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