2017-07-07 93 views
0

我的问题是:为什么变量“_random”在行为被定义为静态/非静态时发生变化?为什么随机变量的行为在定义为静态或非静态时有所不同?

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

==> when not:_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(); 

     } 
    } 
} 

注意:不知何故,我无法格式化我的帖子,对不起。

问候

+4

查看[Random ctor](https://msdn.microsoft.com/en-us/library/h343ddh9(v = vs.110).aspx)页面上的注释:*默认种子值源自系统时钟并具有有限的分辨率。因此,通过对默认构造函数的调用而紧密连续创建的不同Random对象将具有相同的默认种子值,因此将产生相同的随机数集合。* – Clemens

回答

5

因为你正在创建您在循环创建每个Shape对象,这意味着它们将产生相同随机数序列的随机数发生器从系统中播种新Random对象时钟。

如果您在时间上创建新的Random实例时经常发生这种情况。

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

+1

只需要将'static'作为Random '不是线程安全的。只是另一个需要注意的问题。 – Enigmativity

相关问题