为什么随机变量的行为在定义为静态或非静态时会有所不同?
Why the behaviour of a Random variable differs when defining as static or not-static?
我的问题是:当变量“_random”定义为静态/非静态时,为什么它的行为会发生变化?
==> 当静态定义时:_random.nextDouble() returns 真正的随机值。
==> 当不是:_random.nextDouble() returns 几乎相同的值。
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();
}
}
}
注意:我无法格式化 post,抱歉。
此致
因为您正在为循环中创建的每个 Shape
对象创建一个新的 Random
对象,这意味着它们将产生与随机生成器播种相同的一系列随机数来自系统时钟。
如果您创建新的 Random
个实例的时间太近,就会发生这种情况。
当您将 _random
字段定义为 static
时,只会创建一个 Random
对象并在 Shape
[=23= 的所有实例中使用].
我的问题是:当变量“_random”定义为静态/非静态时,为什么它的行为会发生变化?
==> 当静态定义时:_random.nextDouble() returns 真正的随机值。
==> 当不是:_random.nextDouble() returns 几乎相同的值。
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();
}
}
}
注意:我无法格式化 post,抱歉。
此致
因为您正在为循环中创建的每个 Shape
对象创建一个新的 Random
对象,这意味着它们将产生与随机生成器播种相同的一系列随机数来自系统时钟。
如果您创建新的 Random
个实例的时间太近,就会发生这种情况。
当您将 _random
字段定义为 static
时,只会创建一个 Random
对象并在 Shape
[=23= 的所有实例中使用].