Tim*_*ams 6 c# random wpf statistics colors
我的一个学生有一个很酷的结果,我无法解释.在她的代码中,她想用随机颜色创建随机圆圈(在WPF中).她创造了典型的初学者错误,创造了多个随机发生器,但请耐心等待.
这是代码:
Random cir = new Random();
Random color = new Random();
for (i = 0; i < 100; i++)
{
int r = cir.Next(0, 50);
diameter = r * 2;
int posx = cir.Next(0, (510 - diameter));
int posy = cir.Next(0, (280 - diameter ));
byte c1 = (byte)color.Next(255);
byte c2 = (byte)color.Next(255);
byte c3 = (byte)color.Next(255);
SolidColorBrush usedcolor = new SolidColorBrush(Color.FromRgb(c1,c2,c3
));
Ellipse circle = new Ellipse();
circle.Height = diameter;
circle.Width = diameter;
circle.Margin = new Thickness(posx, posy, 0, 0);
circle.Stroke = usedcolor;
// melkweg.StrokeThickness = dikte;
Ruimte.Children.Add(circle);
}
Run Code Online (Sandbox Code Playgroud)
这将始终产生相同的效果:颜色显示为"分组",您将始终在同一区域中获得相同的颜色.两个例子:

我知道两个随机生成器是在准完全相同的时刻创建的,因此具有相同的种子并且基本上是"同步的".但是,由于我们要求每个Next都有不同的范围我认为这会导致不相关的数字,但我显然是错的.(Range是否有影响?Random.Next是否始终生成0到1之间的数字,然后将其扩展(非规范化?)到期望的范围?)
即使只是在cir或color上再调用一个Next()(例如color.Next(1);)也会根据需要生成一个完全随机的图形,而不是冷却但不需要的效果.
所以我的主要问题是,为什么这些颜色"分组"以及随机数生成和"同步"生成器的哪个方面我错过了?
希望这个解释是完整的,有人可以帮助我.谢谢你!
所以Random.Next(int min, int max)工作大致如下:
(double * (max - min)) + min这意味着如果你有两个具有相同种子的random,对它们的并行调用将产生完全相关的值,无论你使用什么范围.
var r1 = new Random(2);
var r2 = new Random(2);
Console.WriteLine(r1.Next(0, 10)); // 7
Console.WriteLine(r1.Next(0, 10)); // 4
Console.WriteLine(r1.Next(0, 10)); // 1
Console.WriteLine(r2.Next(0, 20)); // 15
Console.WriteLine(r2.Next(0, 20)); // 8
Console.WriteLine(r2.Next(0, 20)); // 3
Run Code Online (Sandbox Code Playgroud)
在您的示例中,您有两个具有相同种子的random,并且您在每次循环迭代时将它们中的每一个调用正确3次.这有什么影响?
由此我认为很明显为什么圆圈按颜色(G和B部分)组合在一起.
每当你再添加一个Random.Next对任何一个random的调用时 - 它会打破完美的3 + 3调用相关性,因此效果消失(尽管如果你Random.Next调用两个 randoms,你将再次产生相同的效果).
| 归档时间: |
|
| 查看次数: |
94 次 |
| 最近记录: |