12

人々は通常、を使用するときに常に同じ番号を取得する理由を尋ねますRandomRandom彼らの場合、彼らは(1つのインスタンスだけを使用するのではなく)毎回の新しいインスタンスを意図せずに作成します。これはもちろん、常に同じ数になります。しかし、私の場合、異なる数のストリームを返すいくつかのインスタンスが必要です。Random

プログラムを再起動すると同じ値が何度も得られるため、ハードコードされたシードを使用することは私の意見では悪い考えです。これはどうですか:

int seed1 = (int)DateTime.Now.Ticks - 13489565;
int seed2 = (int)DateTime.Now.Ticks - 5564;

これはばかげて素朴に見えることは知っていますが、再起動するたびに同じ値を回避し、両方のシードが異なるはずです。または多分

Random helper = new Random();
int seed1 = helper.Next(1, int.MaxValue);
int seed2 = helper.Next(1, int.MaxValue);

ご覧のとおり、私はここでは少し創造性がなく、あなたの助けが必要です。ありがとう。

4

3 に答える 3

4

私はあなたの2番目のアプローチを使用します:

int randomCount = 10;
Random seeder = new Random();
var randoms = Enumerable.Range(0, randomCount)
    .Select(i => new Random(seeder.Next()))
    .ToList();

これは、linqを使用して、異なるシードの10個のランダムインスタンスのリストを作成します。したがって、拡張メソッドusing System.Linq;にアクセスできる必要があります。Select

シーダーをインスタンスの1つとして再利用することもできます。

int randomCount = 10;
Random seeder = new Random();
var randoms = Enumerable.Range(0, randomCount - 1)
    .Select(i => new Random(seeder.Next()))
    .Concat(new [] { seeder })
    .ToList();
于 2012-12-21T22:34:18.517 に答える
4

Jon Skeetは、セカンダリRandomオブジェクトとロックを使用してRandomオブジェクトファクトリを作成することを提案しています。例えば:

    public static Random NewRandom() 
    { 
        lock (globalLock) 
        { 
            return new Random(secondaryRandom.Next()); 
        } 
    } 

JonSkeetのブログで完全なソースコードを見てください。

于 2012-12-21T22:38:12.827 に答える
1

暗号化ジェネレーターを使用してシードを作成できます。

public static Random CreateRandom()
{
    using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider())
    {
        byte[] bytes = new byte[4];
        rng.GetNonZeroBytes(bytes);
        int seed = BitConverter.ToInt32(bytes, 0);
        return new Random(seed);
    }
}

もちろん、intが必要な場合は、intをRNGCryptoServiceProvider直接生成するために使用できますが、System.Randomおそらくより高速です。

于 2012-12-21T22:55:33.307 に答える