Objective-C可重复随机数生成器a la java.util.Random

时间:2012-09-03 18:56:26

标签: objective-c random

为了测试和其他目的,能够生成多个可重复随机数流通常很有用。在Java中,有java.util.Random。您可以创建多个Random对象,每个对象都有自己的种子,以便每次运行程序时对任何特定Random实例的后续调用都将返回相同的伪随机数序列。我已经看过arc4random的文档,它看起来像一个伟大的生成器。但是,我没有看到任何方式提供种子或无论如何支持多个独立实例。看起来像BSD库函数的random()系列是最好的方法。类似下面的摘录...

@interface Random : NSObject {
    @private
    char _state[256];
}

+ (Random *)getDefaultInstance;
+ (Random *)getRepeatableInstance;
- (Random *)init;
- (Random *)initWithSeed:(unsigned)seed;
- (long)nextLong;
@end

@implementation Random

- (void)setup:(unsigned)seed
{
    initstate(seed, _state, sizeof(_state));
}

- (Random *)init
{
    self = [super init];
    unsigned seed = (unsigned)arc4random();
    [self setup:seed];
    return self;
}

- (Random *)initWithSeed:(unsigned int)seed
{
    self = [super init];
    [self setup:seed];
    return self;
}

- (long)nextLong
{
    char *oldState = setstate(_state);
    long result = random();
    setstate(oldState);
    return result;
}
@end

还有其他事情吗?我并不担心线程安全问题。我不会在线程中使用生成器。

2 个答案:

答案 0 :(得分:1)

"是否还有其他事情可以做到这一点?"

总是很难用#34; no"因为很难说我知道一切因为我当然不知道,但是没有 - 我从来没有遇到过类似的东西(作为Cocoa类,就是这样。用例本身很常见足够)。

答案 1 :(得分:0)

您想要的是伪随机数生成。 这里的一些算法https://mathoverflow.net/questions/29494/pseudo-random-number-generation-algorithms或更多信息http://en.wikipedia.org/wiki/Random_number_generators

使用系统功能(rand()srand()random()srandom()arc4random())通常足以满足每个人的需求。

另请注意,obj-c中的long与Java中的long非常不同。