代码之家  ›  专栏  ›  技术社区  ›  Joshua

在数组中随机选取一个对象

  •  82
  • Joshua  · 技术社区  · 16 年前

    1、2、3和4。 如何从这个数组中随机选取一个对象?

    8 回复  |  直到 16 年前
        1
  •  192
  •   Iulian Onofrei Denis Oliveira    8 年前

    @Darryl的回答是正确的,但可能需要一些小的调整:

    NSUInteger randomIndex = arc4random() % theArray.count;
    

    修改:

    • 使用 arc4random() 结束 rand() random() 更简单,因为它不需要种子(调用 srand() srandom()
    • 这个 modulo operator ( % )使整个语句更短,同时也使其语义更清晰。
        2
  •  17
  •   funroll    12 年前

    id object = array.count == 0 ? nil : array[arc4random_uniform(array.count)];
    

    有必要检查一下 count 因为一个非- nil 但是空的 NSArray 0 对于 计数 ,和 arc4random_uniform(0) 退货 0 . 所以如果没有检查,你将超出数组的界限。

    因为它会导致空数组崩溃:

    id object = array[arc4random_uniform(array.count)];
    

    供参考,以下是 documentation

    u_int32_t
    arc4random_uniform(u_int32_t upper_bound);
    
    arc4random_uniform() will return a uniformly distributed random number less than upper_bound.
    

    手册页没有提到这一点 arc4random_uniform 什么时候 upper_bound .

    ARC4U均匀 定义于 <stdlib.h> ,但添加 #import

        3
  •  11
  •   Darryl H. Thomas    16 年前

    也许是这样的:

    NSUInteger randomIndex = (NSUInteger)floor(random()/RAND_MAX * [theArray count]);
    

    不要忘记初始化随机数生成器(例如srandomdev())。

        4
  •  9
  •   Aliaksandr Bialiauski    10 年前
    @interface NSArray<ObjectType>  (Random)
    - (nullable ObjectType)randomObject;
    @end
    
    @implementation NSArray (Random)
    
    - (nullable id)randomObject
    {
        id randomObject = [self count] ? self[arc4random_uniform((u_int32_t)[self count])] : nil;
        return randomObject;
    }
    
    @end
    

    编辑:为Xcode 7更新。泛型,可空性

        5
  •  1
  •   user23743 user23743    14 年前

    生成一个随机数并将其用作索引。例子:

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
            NSArray *array = [NSArray arrayWithObjects: @"one", @"two", @"three", @"four", nil];
            NSUInteger randomNumber;
            int fd = open("/dev/random", O_RDONLY);
            if (fd != -1) {
                read(fd, &randomNumber, sizeof(randomNumber));
                close(fd);
            } else {
                fprintf(stderr, "Unable to open /dev/random: %s\n", strerror(errno));
                return -1;
            }
            double scaledRandomNumber = ((double)randomNumber)/NSUIntegerMax * [array count];
            NSUInteger randomIndex = (NSUInteger)floor(scaledRandomNumber);
            NSLog(@"random element: %@", [array objectAtIndex: randomIndex]);
        }
        return 0;
    }
    
        6
  •  0
  •   Pathetic Learner    14 年前
     srand([[NSDate date]  timeIntervalSince1970]);
    
     int inx =rand()%[array count];
    

    其中srand()可以位于随机选取函数之前程序中的任何位置。

        7
  •  0
  •   jungledev    11 年前
    ObjectType *objectVarName = [array objectAtIndex:arc4random_uniform((int)(array.count - 1))];
    

    如果你想把它转换成一个int,这里有一个解决方案(当你需要从一个非连续的数字数组中随机得到一个int,在随机枚举调用的情况下,等等)

    int intVarName = (int)[(NSNumber *)[array objectAtIndex:arc4random_uniform((int)(array.count - 1))] integerValue];
    
        8
  •  0
  •   Vega Stipe    8 年前

    在Swift 4中:

    let array = ["one","two","three","four"]
    let randomNumber = arc4random_uniform(UInt32(array.count))
    
    array[Int(randomNumber)]