为了测试和其他目的,能够生成多个可重复随机数流通常很有用。在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
还有其他事情吗?我并不担心线程安全问题。我不会在线程中使用生成器。
答案 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
非常不同。