テストやその他の目的のために、反復可能な乱数の複数のストリームを生成できると便利なことがよくあります。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
これを行う何かがすでにありますか?スレッドセーフについては心配していません。スレッド間でジェネレーターを使用しません。