4

興味深いことに、C# に付属する Random クラスをいじっています。私は未来を予測しようとしています。疑似乱数であるため、数値を予測する何らかの方法が必要です。これまでのところ、考えられる唯一の方法はブルート フォース (可能なすべてのシードを取得し、それらの乱数のパターンを見つけること) ですが、シードが -2,147,483,647 から 2,147,483,647 までの範囲になる可能性があるため、処理能力が高すぎると思います。

これまでのところ、次のように判断しています。

new Random() == new Random(Environment.TickCount)

また、これらのクラスはどちらも同じ乱数を同じ順序で提供します。

Random クラス インスタンスのシードを特定する方法はありますか? Random クラスがインスタンス化されたときの Environment.TickCount がわかれば、乱数を予測できますが、できるかどうかはわかりません。

4

2 に答える 2

3

の実装は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;
}
于 2013-07-02T08:07:55.330 に答える