c# – 使用Random()和颜色解释有趣的现象
我的一个学生有一个很酷的结果,我无法解释.
在她的代码中,她想用随机颜色创建随机圆圈(在 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); circle.Stroke = usedcolor; // melkweg.StrokeThickness = dikte; Ruimte.Children.Add(circle); } 这将始终产生相同的效果:颜色显示为“分组”,您将始终在同一区域中获得相同的颜色. 我知道两个随机生成器是在准完全相同的时刻创建的,因此具有相同的种子并且基本上是“同步的”. 即使只是在cir或color上再调用一个Next()(例如color.Next(1);)也会根据需要生成一个完全随机的数字,而不是冷却但不需要的效果. 所以我的主要问题是,为什么这些颜色“分组”以及随机数生成和“同步”生成器的哪个方面我错过了? 希望这个解释是完整的,有人可以帮助我.谢谢你! PS这是所需的输出(使用1个随机,或添加无用的Next() – 调用) 解决方法
所以Random.Next(int min,int max)的工作方式大致如下:
>在整数范围内生成随机整数 这意味着如果你有两个具有相同种子的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次.这有什么影响? >半径和R部分颜色具有很强的相关性 由此我认为很明显为什么圆圈按颜色(G和B部分)组合在一起. 每当你向任何一个randoms添加一个Random.Next调用时 – 它会打破完美的3 3个调用关联,因此效果消失(尽管如果你对两个random进行Random.Next调用,你将再次产生相同的效果). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |