为什么定义为静态或非静态时Random变量的行为会有所不同?

时间:2017-07-07 12:38:55

标签: c# wpf random static-variables

我的问题是:为什么变量“_random”的行为在定义为静态/非静态时会发生变化?

==>当静态定义时:_random.nextDouble()返回真正的随机值。

==>当不是:_random.nextDouble()返回几乎相同的值。

class Shape   
{  
    protected Canvas _canvas;
    protected UIElement _element;
    static Random _random = new Random();

    public Shape(Canvas canvas)
    {
        _canvas = canvas;
    }

    public void Draw()
    {
        double val1 = _canvas.ActualWidth * _random.NextDouble();
        double val2 = _canvas.ActualHeight * _random.NextDouble();
        _element.SetValue(Canvas.LeftProperty, val1);
        _element.SetValue(Canvas.TopProperty, val2);
        _canvas.Children.Add(_element);
    }

}


public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        Shape s1 = new Circle(MemoCanvas);

        for (int i = 0; i < 100; i++)
        {
            Shape shape1 = new Circle(MemoCanvas);
            shape1.Draw();

            Shape shape2 = new Square(MemoCanvas);
            shape2.Draw();

        }
    }
}

注意:不知怎的,我无法格式化我的帖子,抱歉。

最好的问候

1 个答案:

答案 0 :(得分:5)

因为您要为循环中创建的每个Random对象创建一个新的Shape对象,这意味着它们将生成与随机生成器相同的一系列随机数。系统时钟。

如果您在时间上过近创建新的Random实例,则会发生这种情况。

_random字段定义为static时,只会在Random类的所有实例中创建并使用一个Shape个对象。