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

「これを行う何かがすでにありますか?」

私がすべてを知っていると主張するのは難しいので、「いいえ」と答えるのは常に難しいです。なぜなら、私は確かに知らないからです。十分に一般的です)。

于 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 に答える