1

我想生成一个介于 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;
    }
}
4

8 回答 8

6

这个怎么样。

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

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

于 2012-09-18T12:00:18.450 回答
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];
于 2012-09-18T12:02:47.977 回答
2

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

想法1:

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

  1. 生成随机数r = arc4random() % (N - K)
  2. 找到第 r 个未使用的问题。
  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);
}
于 2012-09-18T12:07:21.333 回答
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)。我已经修复了两次以上问题,但我仍然不确定它是否正确!如果可能,请使用库中的随机洗牌算法。

于 2012-09-18T13:13:32.943 回答
0

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

如果一个问题不能重复,那么你需要做的是有某种机制,这样当一个问题被使用时,它就不会被放回从中进行选择的问题集中。

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

这意味着您第一次选择时,您将做一个十分之一的随机数。之后,它将始终是 9 中的 1 随机数。

于 2012-09-18T12:05:43.783 回答
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;
}
于 2012-09-18T12:10:48.820 回答
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;
    }

那是我产生的一些糟糕的东西,我想这个想法正是你需要的=)

于 2012-09-18T12:56:15.290 回答
0

遵循此代码

NSMutableIndexSet *indexSet = [NSMutableIndexSet new];

while ([indexSet count]<10) {

int randomNumber = arc4random_uniform(11);

   if(randomNumber!=0)
   {
       [indexSet addIndex:randomNumber];
   }
}
于 2012-09-18T13:02:35.817 回答