使用Random()和colors

时间:2016-12-01 10:08:13

标签: c# wpf random colors statistics

我的一个学生有一个很酷的结果,我无法解释。 在她的代码中,她想用随机颜色创建随机圆圈(在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);
        }

这将始终产生相同的效果:颜色似乎被分组&#39; ,您将始终在同一地区获得相同的颜色。 两个例子: enter image description here

据我所知,两个随机生成器是在准完全相同的时刻创建的,因此具有相同的种子,并且基本上是同步的&#39;。 但是,由于我们要求每个Next都有不同的范围我认为这会导致不相关的数字,但我显然是错的。 (Range是否有影响?Random.Next是否始终生成0到1之间的数字,然后将其扩展(非规范化?)到期望的范围?)

即使只是在cir或color上再调用一个Next()(例如color.Next(1);)也会根据需要生成一个完全随机的数字,而不是冷却但不需要的效果。

所以我的主要问题是,为什么这些颜色&#34;分组&#34;以及随机数生成的哪个方面和&#39;同步&#39;我错过了发电机吗?

希望这个解释已经完整,有人可以帮助我。非常感谢!

PS这里是所需的输出(使用1个随机,或添加无用的Next() - 调用) enter image description here

1 个答案:

答案 0 :(得分:8)

所以Random.Next(int min, int max)大致如下:

  1. 在整数范围内生成随机整数
  2. 将其映射为在0 .. 1范围内加倍。
  3. 将该双倍展开到您的范围(double * (max - min)) + min
  4. 这意味着如果你有两个具有相同种子的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
    

    在你的例子中,你有两个带有相同种子的random,你在每次循环迭代时都会调用它们3次。这有什么影响?

    1. 半径和R部分颜色具有很强的相关性
    2. X坐标和G部分颜色有很强的相关性(当X很大时 - G也很大,反之亦然)。
    3. Y坐标和B部分颜色具有很强的相关性。 (只要Y很大,B也很大,反之亦然)。
    4. 由此我认为很明显为什么圆圈按颜色(G和B部分)组合在一起。

      每当你向任何一个randoms添加一个Random.Next次呼叫时,它会打破完美的3 + 3呼叫相关性,因此效果会消失(尽管如果你{em>}要求{em>} randoms,你会再次产生同样的效果。)