0

一部の TreeView では、アイテムの Background プロパティの多くの値をテストしたいと考えています。

だから私は今200個のアイテムで満たされたツリーを持っています.

可能な値は次のとおりです。

public enum EnumItemState
{ 
    Default,
    Red,
    Green,
    Yellow,
}

ビューでさまざまな値をすばやくテストしたかったので、次のコードを書きました。

    private EnumItemState GetRandomItemState()
    {

        var rand = new Random();

        var val = rand.Next(0, 3);

        switch (val)
        {
            case 0:
                {
                    return EnumItemState.Red;
                }
            case 1:
                {
                    return EnumItemState.Green;
                }
            case 2:
                {
                    return EnumItemState.Yellow;
                }
            default:
                {
                    return EnumItemState.Default;
                }
        }
    }

しかし、それはまったくランダムではありません。1 回の実行ではすべての値が同じです。

私の「ランダム」メソッドのどこかにブレークポイントがあると、別の「よりランダムな」結果が得られます。

ここで何が起きてるの?

より良いランダム結果を得るには?

それは何らかの最適化なので、すべてのランダムが同じ時間シードで作成され、同じ結果が得られますか?

4

2 に答える 2

1

同じ値でシードされているメソッドを呼び出すたびに新しい Random オブジェクトを作成しているため (現在の時間に基づいています)、同じランダム値を取得し続けます。

代わりにこれを行います:

void CallingMethod()
{
    Random rnd = new Random();

    for (int i = 0;i < 200;++i)
        EnumItemState state = GetRandomItemState(rnd);
}

private EnumItemState GetRandomItemState(Random rnd)
{
    // Same code you had here, but don't create new instance of Random
}
于 2013-03-20T20:03:51.573 に答える
0

タイトなループでこれを非常に頻繁に呼び出していると仮定します (つまり、呼び出しの間にほとんどまたはまったく時間がありません)。

のデフォルトの ctor はRandom次のようになります。

public Random() : this(Environment.TickCount)
{
}

わかりEnvironment.TickCountますか?複数のRandomインスタンスを非常に迅速に (つまり、そのティック カウントが変更される前に) 新規作成しようとすると、効果的にまったく同じ乱数シーケンスが得られます。つまり、「PseudoRandom」です。

次のいずれかを実行できます。

  • 通話の合間にしばらくお待ちください
  • 手動でシードを ctor に渡す
  • System.Security名前空間で prng を使用する
于 2013-03-20T20:04:52.560 に答える