1

出于测试和其他目的,能够生成多个可重复随机数流通常很有用。在 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

是否已经有其他东西可以做到这一点?我不关心线程安全。我不会跨线程使用生成器。

4

2 回答 2

1

“是否已经有其他东西可以做到这一点?”

总是很难用“不”来回答,因为很难说我知道一切,因为我当然不知道,但是不——我从来没有遇到过这样的事情(作为 Cocoa 类,也就是说。用例本身是很常见)。

于 2012-09-03T22:22:04.960 回答
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 中与在 Javalong中非常不同。long

于 2012-09-03T19:32:19.673 回答