【问题标题】:Random number generation from an NSMutable array [duplicate]从 NSMutable 数组生成随机数
【发布时间】:2013-05-31 17:21:02
【问题描述】:

我需要从我在 for 循环中尝试过的数组中生成随机数

rnd = arc4random_uniform(arr.count); 

它生成了随机数,但一些数字被重复了也在 math.h 中尝试了 Random() 同样的问题仍然存在,请帮助我.. 提前谢谢..

【问题讨论】:

  • 你试过int r = arc4random() % 5;,如果你想要04
  • 当然会有重复,因为它们是由randomly生成的。如果生成遵循某种模式,那么它不会被称为随机的吧?
  • 你的意思是你需要通过随机顺序的唯一数字来感受一个数组吗?更多代码可以帮助您了解您的想法
  • @PraveenS 我怎样才能得到唯一的随机数..

标签: iphone ios objective-c


【解决方案1】:

如果我明白了

“我需要从一个数组中生成随机数”

正确,您希望从数组中随机获取数字,如果是这样,那么 首先将数字存储在 NSMutableArray 中

NSMutableArray *arr=//store your numbers in this array.

-(void)getRandomNumberFromArray:(NSMutableArray *)arr{
int r = arc4random() % arr.count;
int number=[arr objectAtIndex:r];
[arr removeObjectAtIndex:r];
}

【讨论】:

    【解决方案2】:

    为每个元素生成一个随机数,然后检查以确保它与现有元素之一不同。如果已存在,请重试。

    for(int i = 0; i < arr.count;i++)
    {
       BOOL isRandom = YES;
       int rand = -1;
       while(!isRandom )
       (
         isRandom = YES;
         rand = arc4random() % 5;
         for(int j = 0; j < i; j++)
         {
            int existingNumber = arr[j];
            if(existingNumber == rand)
            {
               isRandom = NO;
               break;
            }
         }
      }
      arr[i] = rand;
    }
    

    另一种选择是首先将它们分配为具有递增值,然后对可变数组进行洗牌。 What's the Best Way to Shuffle an NSMutableArray?

    【讨论】:

      【解决方案3】:

      如果我理解你的问题,那么你不需要随机数,你需要洗牌数组中的元素?

      那你需要用这个方法,

      -(void)shuffleWithArray:(NSArray*)cardsArray
      {
      
          NSMutableArray *shuffleArray =[[NSMutableArray alloc]initWithArray:cardsArray];
      
      
         // NSUInteger count1=[shuffleArray count];
         for (NSUInteger i= 0; i<[shuffleArray count]; i++) 
          {
      
          int nElement=[shuffleArray count] -i;
          int n=(arc4random()%nElement + i);
          [shuffleArray exchangeObjectAtIndex:i withObjectAtIndex:n];
      
        }
      
      }
      

      【讨论】:

        【解决方案4】:

        您可以使用以下功能。

        @property (nonatomic,strong) NSMutableArray * numbers;
        
        
        - (NSInteger) nonRepeatedNumber
        {
        
           if(_numbers == nil)
            {
               _numbers = [[NSMutableArray alloc]init];
            } 
        
           NSInteger number = arc4random()% arr.count;
           while ([_numbers containsObject:[NSNumber numberWithInt:number]])
           {
               number = arc4random()% arr.count;;
           }
          [_numbers addObject:[NSNumber numberWithInt:number]];
        
           return number;
        }
        

        【讨论】:

        • 此方法有效,但仅在达到随机数的maxValue 之前有效,因此不能无限使用。
        • @qegal 不可能追踪唯一的无限随机数!但是 OP 想要指定特定范围的唯一随机值。
        • 这将无法重复生成值.. 我试过这个
        • @JitendraDeore 没有办法重复值。你一定是在什么地方犯了错误!
        • @Vinayak Kini 我试过你的代码,它会生成相同的重复号码......
        【解决方案5】:

        查看以下教程。它一定对你有帮助。

        iOS Random Number generator

        【讨论】:

          【解决方案6】:

          试试下面的方法

           -(NSMutableArray*)randomNumbersfromArray:(NSArray*)array    {
                  NSArray *numbers = array;
                  int count = [numbers count];
                  NSMutableArray *addedIndexes = [[NSMutableArray alloc]initWithCapacity:count];
                  NSMutableArray *addedObjects = [[NSMutableArray alloc]initWithCapacity:count];
                  int i = 0;
                  while ([addedIndexes count] != [numbers count]) {
          
                      int random = arc4random() % count ;
                      if (![addedIndexes containsObject:[NSString stringWithFormat:@"%i",random]]) {
          
                          [addedIndexes addObject:[NSString stringWithFormat:@"%i",random]];
                          [addedObjects addObject:[numbers objectAtIndex:random]];
                          i++;
                      }
          
                  }
                  return addedObjects;
              }
          

          【讨论】:

            【解决方案7】:
            #include <stdlib.h>
            
            
            int r = 0;
            if (arc4random_uniform != NULL)
                r = arc4random_uniform (arr.count);
            else
                r = (arc4random() % arr.count);
            
            int randomNumberFromArray=[arr objectAtIndex:r];
            

            编辑

            Bingo. 经过一番思考,我成功了

            -(NSArray *)randomizeArray:(NSArray *)inputArray
            {
                NSMutableArray *checkArray=[[NSMutableArray alloc]initWithCapacity:3];
                NSMutableArray *outputArray=[[NSMutableArray alloc]initWithCapacity:3];
            
                while ([outputArray count]<[inputArray count])
                {
                    int r=[self getRandomNumber:[inputArray count]];
                    if ([checkArray containsObject:[NSNumber numberWithInt:r]])
                    {
            
            
                    }
                    else
                    {
                        [checkArray addObject:[NSNumber numberWithInt:r]];
                        [outputArray addObject:[inputArray objectAtIndex:r]];
                    }
                }
                return outputArray;
            }
            
            
            -(int)getRandomNumber:(int)maxValue
            {
                int r = 0;
                if (arc4random_uniform != NULL)
                    r = arc4random_uniform (maxValue);
                else
                    r = (arc4random() % maxValue);
                return r;
            }
            

            这个randomizeArray: 方法会给你整个数组随机化

            【讨论】:

            • 只从数组中获取第一个值....
            • @JitendraDeore 现在可以正常工作了。经过测试
            猜你喜欢
            • 1970-01-01
            • 2021-05-15
            • 1970-01-01
            • 1970-01-01
            • 2011-02-01
            • 1970-01-01
            • 2016-04-27
            • 1970-01-01
            • 2013-11-15
            相关资源
            最近更新 更多