积极答复者
如何让产生的随机数不重复,且在一个区间范围内,非常散乱?

问题
-
我用WPF在一个全屏(结果应该跟全屏与否,没有因果关系)界面下产生随机布局的窗口。
private void CreateRectangle()
{
//绘制矩形
Rectangle drawRectangle = new Rectangle();drawRectangle.Stroke = randBrushColor();
drawRectangle.Fill = randBrushColor();
//drawRectangle.HorizontalAlignment = randomInt(Convert.ToInt32(this.Width));
//drawRectangle.VerticalAlignment = randomInt(Convert.ToInt32(this.Height));
drawRectangle.Width = randomInt(Convert.ToInt32(canvas1.ActualWidth));
drawRectangle.Height = randomInt(Convert.ToInt32(canvas1.ActualHeight));
Canvas.SetTop(drawRectangle, randomInt(Convert.ToInt32(canvas1.ActualHeight )));
Canvas.SetLeft(drawRectangle, randomInt(Convert.ToInt32(canvas1.ActualWidth)));
canvas1.Children.Add(drawRectangle);
} // end private void CreateRectangle()
private int randomInt(int value)
{
Random rand = new Random();
int randInt = rand.Next(value);sw.WriteLine("RandomInt(int {0}) = {1}", value, randInt);
return randInt;
}
private byte randomColor()
{
Random rand = new Random();
byte randByte = Convert.ToByte(rand.Next(255));sw.WriteLine("RandomColor(): ColorByte = {0}", randByte.ToString());
return randByte;
}private Brush randBrushColor()
{
//产生随机颜色
SolidColorBrush brushColor = new SolidColorBrush();
brushColor.Color = Color.FromArgb(255, randomColor(), randomColor(), randomColor());sw.WriteLine("RandomBrushColor() Color is {0}", brushColor.Color.ToString());
return brushColor;
}
我在每次调用随机产生函数时,都把随机结果记录到一个文件,下面是这个文件的记录(部分能说明问题的):
RandomBrushColor() Color is #FF8D8D8D
RandomInt(int 1258) = 700
RandomInt(int 993) = 552
RandomInt(int 993) = 552
RandomInt(int 1258) = 700
RandomColor(): ColorByte = 28
RandomColor(): ColorByte = 28
RandomColor(): ColorByte = 28
RandomBrushColor() Color is #FF1C1C1C
RandomColor(): ColorByte = 28
RandomColor(): ColorByte = 28
RandomColor(): ColorByte = 28
RandomBrushColor() Color is #FF1C1C1C
RandomInt(int 1258) = 139
RandomInt(int 993) = 109
RandomInt(int 993) = 109
RandomInt(int 1258) = 139
RandomColor(): ColorByte = 169
RandomColor(): ColorByte = 169
RandomColor(): ColorByte = 169
RandomBrushColor() Color is #FFA9A9A9
RandomColor(): ColorByte = 169
RandomColor(): ColorByte = 169
RandomColor(): ColorByte = 169
RandomBrushColor() Color is #FFA9A9A9
RandomInt(int 1258) = 836
RandomInt(int 993) = 659
RandomInt(int 993) = 23
RandomInt(int 1258) = 29
RandomColor(): ColorByte = 147
RandomColor(): ColorByte = 147
RandomColor(): ColorByte = 147
RandomBrushColor() Color is #FF939393
RandomColor(): ColorByte = 147
RandomColor(): ColorByte = 147
RandomColor(): ColorByte = 147
RandomBrushColor() Color is #FF939393
RandomInt(int 1258) = 726
RandomInt(int 993) = 573
RandomInt(int 993) = 573
RandomInt(int 1258) = 726
RandomColor(): ColorByte = 33
RandomColor(): ColorByte = 33
RandomColor(): ColorByte = 33
RandomBrushColor() Color is #FF212121
RandomColor(): ColorByte = 33
RandomColor(): ColorByte = 33
RandomColor(): ColorByte = 33
由于是各自调用,因此我认为,应该产生不同的值,那为什么,其中会有些值是连续相等的?由于rgb三色值相当,产生的矩形大多数是灰的,只是明暗各不相同。且打印结果始终是一个由远至近的方块串(因为我不清空之前打印的结果,所有的矩形都被反复叠加在原来的上面)。这些方块不会出现在屏幕的其它位置。
这台奇怪了,取随机数,就是要它的结果凌乱;如果如此有秩序,那实在令我怀疑这是不是随机数;或有什么别的方法可以试它们凌乱(越乱越好)。谢谢!
答案
全部回复
-
更糟糕的是,我通过在按键变化的事件中增加一个TempInt = Convert.ToInt32(e.Key.GetHashCode());来取得我按键的数值,结合:int randInt = rand.Next(TempInt) % value;和byte randByte = Convert.ToByte(rand.Next(TempInt) % 255);
但最后得出来的结果却是:
RandomBrushColor() Color is #FF3E3E3E
RandomInt(int 1258) = 62
RandomInt(int 993) = 62
RandomInt(int 993) = 62
RandomInt(int 1258) = 62
RandomColor(): ColorByte = 27
RandomColor(): ColorByte = 27
RandomColor(): ColorByte = 27
RandomBrushColor() Color is #FF1B1B1B
RandomColor(): ColorByte = 27
RandomColor(): ColorByte = 27
RandomColor(): ColorByte = 27
很明显:有几个int的范围已经修改了,但产生的随机结果还是62;这还是随机数吗?实在不理解。
注int 1258和int 993 的值是固定的,因为是当前绘图区域的宽度和高度。