如何在ios中生成非重复随机数?

时间:2011-09-20 11:58:48

标签: ios random numbers

  

可能重复:
  Non repeating random numbers in Objective-C

如何生成非重复随机数?

我在很多网站上都看过这个,但是他们提供了main.c文件代码。

当我使用main.c文件时,代码工作正常,但是当我尝试转换为my.m文件时,它无效。

示例:

我需要随机获取0-10之间的所有数字。数字不应再重复。

2 个答案:

答案 0 :(得分:2)

使用arc4random() 例如:

- (NSData *)randomBytes:(size_t)count
{
    NSMutableData *data = [NSMutableData dataWithLength:count];

    SecRandomCopyBytes( kSecRandomDefault,
                        data.length,
                        data.mutableBytes);
    return data;
}

事实证明,在一个范围内获取一个随机数并不像使用mod那么简单。

- (u_int32_t)randomInRangeLo:(u_int32_t)loBound toHi:(u_int32_t)hiBound
{
    u_int32_t random;
    int32_t   range = hiBound - loBound + 1;
    u_int32_t limit = UINT32_MAX - (UINT32_MAX % range);

    do {
        random = arc4random();
    } while (random > limit);

    return loBound + (random % range);
}

答案 1 :(得分:1)

CocoaFu提供了出色的随机数。你要求的是洗牌。最简单的是Fischer-Yates shuffle。 Wikipedia article中提供了几个好的版本。您还可以阅读CocoaFu算法避免的模偏差。

但是,在Objective-C中,C实现绝对没有理由完全相同。如果您在从.c文件移至.m文件时遇到问题,则应发布错误。