iOS:如何生成8个唯一的随机整数?

问题描述

| 我需要生成8个随机整数,但它们必须是唯一的,也就是不重复。 例如,我要在1到8范围内的8个数字。 我已经看过arc4random,但不确定如何使它们独特? 解
-(NSMutableArray *)getRandomInts:(int)amount from:(int)fromInt to:(int)toInt {

  if ((toInt - fromInt) +1 < amount) {
      return nil;    
  }

  NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
  int r;
  while ([uniqueNumbers count] < amount) {

      r = (arc4random() % toInt) + fromInt;
      if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
          [uniqueNumbers addObject:[NSNumber numberWithInt:r]];
      }
  }
  return uniqueNumbers;
}
    

解决方法

        
-(NSMutableArray *)getEightRandom {
  NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
  int r;
  while ([uniqueNumbers count] < 8) {
    r = arc4random();
    if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
      [uniqueNumbers addObject:[NSNumber numberWithInt:r]];
    }
  }
  return uniqueNumbers;
}
如果要限制小于阈值M的数字,则可以通过以下方法进行操作:
-(NSMutableArray *)getEightRandomLessThan:(int)M {
  NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
  int r;
  while ([uniqueNumbers count] < 8) {
    r = arc4random() % M; // ADD 1 TO GET NUMBERS BETWEEN 1 AND M RATHER THAN 0 and M-1
    if (![uniqueNumbers containsObject:[NSNumber numberWithInt:r]]) {
      [uniqueNumbers addObject:[NSNumber numberWithInt:r]];
    }
  }
  return uniqueNumbers;
}
如果M = 8,或者即使M接近8(例如9或10),那么也要花一些时间,您会变得更加聪明。
-(NSMutableArray *)getEightRandomLessThan:(int)M {
  NSMutableArray *listOfNumbers = [[NSMutableArray alloc] init];
  for (int i=0 ; i<M ; ++i) {
    [listOfNumbers addObject:[NSNumber numberWithInt:i]]; // ADD 1 TO GET NUMBERS BETWEEN 1 AND M RATHER THAN 0 and M-1
  }
  NSMutableArray *uniqueNumbers = [[[NSMutableArray alloc] init] autorelease];
  int r;
  while ([uniqueNumbers count] < 8) {
    r = arc4random() % [listOfNumbers count];
    if (![uniqueNumbers containsObject:[listOfNumbers objectAtIndex:r]]) {
      [uniqueNumbers addObject:[listOfNumbers objectAtIndex:r]];
    }
  }
  [listOfNumbers release];
  return uniqueNumbers;
}
    ,        唯一性是您需要提供的东西-随机性API不会为您做到这一点。 如建议的那样,您可以生成一个数字,然后检查它是否与您已经生成的内容发生冲突,如果是,请尝试agin。但是请注意,根据数字的数量和范围的大小,这将成为没有保证终点的算法。 如果您实际上只是想以随机顺序获取一组连续的数字,则这不是实现此目的的方法,因为它可能需要很长的时间才能完成。在这种情况下,首先构建一个包含所有期望值的数组,然后“改组”该数组是一个更好的选择。最好的混洗是Fisher-Yates,但如果您不需要完全无偏的话,也可以按照此处描述的进行操作。     ,        检查已经生成的数字可能很昂贵(从理论上讲,这可能要花很长时间。)但是,这是一个已解决的问题。您需要一种改组算法,例如Fisher-Yates_shuffle 在iOS上可能类似:
NSMutableArray *randSequence = [[NSMutableArray alloc] initWithCapacity:8];
for (int ii = 1; ii < 9; ++ii)
    [randSequence addObject:[NSNumber numberWithInt:ii]];

for (int ii = 8; ii > 0; --ii) {
    int r = arc4random() % (ii + 1);
    [randSequence exchangeObjectAtIndex:ii withObjectAtIndex:r];

// you can now iterate over the numbers in `randSequence` to get
// your sequence in random order
    ,        将数字存储在数组中,每次生成下一个时-检查数组中是否已存在。如果不是,则添加它并继续。     ,        这是一些伪代码 为每个数字1-8生成一个随机数。 将随机数和整数作为键值对添加到字典中 以数组的形式获取字典的所有键(提示:看看
allKeys
方法) 对此数组进行排序(升序或降序并不重要) 现在,以这些数字中的每个数字为键,从字典中获取相应的整数     ,        试试这个代码...这将为您提供在Mutable数组中设置的所有可能的唯一数字...
-(NSInteger) randomNumber {
NSInteger newRandomNumber = (NSInteger) arc4random() % 10;
NSInteger uniqueNumber;
if ([self.arrayContainingNumbers containsObject: [NSNumber numberWithInteger:newRandomNumber]]) {
    [self randomNumber];
    } else {
    [self.arrayContainingNumbers addObject: [NSNumber numberWithInteger:newRandomNumber]];
}
uniqueNumber = [[self.mutableArrayContainingNumbers lastObject]integerValue];
     NSLog(@\"new Unique Number is %ld\",(long)uniqueNumber);

return uniqueNumber;  
}
不要忘记添加此方法:)
    -(NSMutableArray *) arrayContainingNumbers {
if (!_mutableArrayContainingNumbers) {
    _mutableArrayContainingNumbers = [[NSMutableArray alloc] init];
}
return _mutableArrayContainingNumbers; 
}
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...