の実装はRandom
シードをどこにも格納しません。代わりにシード配列を使用します。残念ながら、シードを決定する方法はありません。
シードを取る Random のコンストラクタは次のようになります。
public Random(int Seed)
{
this.SeedArray = new int[0x38];
int num4 = (Seed == 0x80000000) ? 0x7fffffff : Math.Abs(Seed);
int num2 = 0x9a4ec86 - num4;
this.SeedArray[0x37] = num2;
int num3 = 0x1;
for (int i = 0x1; i < 0x37; i++)
{
int index = (0x15 * i) % 0x37;
this.SeedArray[index] = num3;
num3 = num2 - num3;
if (num3 < 0x0)
{
num3 += 0x7fffffff;
}
num2 = this.SeedArray[index];
}
for (int j = 0x1; j < 0x5; j++)
{
for (int k = 0x1; k < 0x38; k++)
{
this.SeedArray[k] -= this.SeedArray[0x1 + ((k + 0x1e) % 0x37)];
if (this.SeedArray[k] < 0x0)
{
this.SeedArray[k] += 0x7fffffff;
}
}
}
this.inext = 0x0;
this.inextp = 0x15;
Seed = 0x1;
}
シードがどこにも保存されていないことがわかります。
(これについて奇妙なことは、何らかの奇妙な理由で最後に Seed 変数に 1 が代入されることですが、それは実際には関係ありません。少し奇妙です。)
Random
後で取得するためにシード値を保持する独自のラッパー クラスを作成できます。実装は次のことを覚えているだけSeed
です:
public class MyRandom: Random
{
public MyRandom() : this(Environment.TickCount)
{
}
public MyRandom(int seed) : base(seed)
{
this.seed = seed;
}
public int Seed
{
get { return seed; }
}
private readonly int seed;
}