1

棒グラフにプロットする乱数を生成する次のコードがあります。ただし、特定の行にブレークポイントを設定した場合にのみ正しく機能します。それ以外の場合は、10 個の新しいデータポイントがすべてまったく同じ数になります。

case 3:
                //Add ten data sets to go through all default colors
                DatasetPairing<BarPresentation, BarGraphDataset<GraphableDouble>> datasetPairing;

                foreach (HorizontalBarPlotter<GraphableDouble, GraphableDouble> graphPlotter in this.Data.GraphPlots)
                {
                    for (int i = 1; i <= 11; i++)
                    {
                        datasetPairing = new DatasetPairing<BarPresentation, BarGraphDataset<GraphableDouble>>();
                        datasetPairing.DatasetPresentation = new BarPresentation();
                        datasetPairing.GraphableDataset = GetOneDataset(0, false);
                        graphPlotter.DatasetMap.Add(datasetPairing); //breakpoint set here
                    }
                    List<IAxis> xAxes;
                    xAxes = new List<IAxis>();
                    xAxes.Add(graphPlotter.DetermineXAxis());
                    this.Data.BottomAxes = xAxes;
                    this.Data.TopAxes = xAxes;
                }
                NextStep = "Return to a single dataset and add comment to values for tooltips";
                break;

なぜこれが起こっているのかわかりません。また、このような問題は聞いたことがありません...おそらく、ビジュアルスタジオのバグですか? どんな助けでも大歓迎です

4

3 に答える 3

6

実際の乱数はなく、疑似乱数のみがあります。乱数の作成は、通常は現在の時間であるシードに基づいています。

新しい乱数が必要になるたびに新しいオブジェクトを作成すると、時間が変わっていないため、同じ数になります。(アプリケーションを実行すると、すべてが 1 ミリ秒未満で行われることに注意してください。アプリケーションをデバッグすると、2 つの新しいランダム変数の作成の間に少し時間がかかるため、乱数が異なります)

1 つのオブジェクトを使用してすべての乱数を作成し、Random.Next() を使用して新しい乱数を取得する必要があります。

クラス Randomのドキュメントを見ると、次の行が表示されます。

デフォルト コンストラクターの呼び出しによって連続して作成される異なる Random オブジェクトは、同一のデフォルト シード値を持ちます。

そして解決策は次のとおりです。

この問題は、単一の Random オブジェクトを使用してすべての乱数を生成することで回避できます。また、システム クロックによって返されるシード値を変更し、この新しいシード値を明示的に Random(Int32) コンストラクターに提供することによって、この問題を回避することもできます。

于 2013-07-08T15:30:21.683 に答える
0

Random クラスを使用している場合は、毎回新しいオブジェクトを作成していないことを確認してください。

msdnから: using the parameterless constructor to create different Random objects in close succession creates random number generators that produce identical sequences of random numbers. This problem can be avoided by creating a single Random object rather than multiple ones.

私は通常、単一の静的 Random オブジェクトを作成し、常に乱数に使用します。これにより、重複がなくなります

于 2013-07-08T15:32:51.010 に答える