2017-07-07 38 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

相關問題