以下是部分代码: private void button1_Click(object sender, System.EventArgs e) { Random r = new Random(); for( int i = 0; i < Len; i++ ) dataArray[i] = 1; for( int i = 0; i < int.Parse(textBox1.Text); i++ ) { double f = r.NextDouble(); /// ( f*(f+2)/(2+1) * Len )是非线性随机数的算法一 /// 原理是取0到1之间的double型随机数f, 加上系数k, 平方后再调整到01之间,表达式如下 /// ((f+k)*(f+k) - k*k)/((k+1)*(k+1) - k*2) = f*(f+k)/(1+k) /// 单击该按钮可查看频度曲线,改变k可改变曲线的倾斜度 /// 详见DOC说明文件 int k = Len/3; // int n = (int)( f*(f+k)/(k+1) * Len ); int n = (int)( k*f*f + (Len-k)*f ); dataArray[n]++; } this.Refresh(); } private void panel1_Paint(object sender, System.Windows.Forms.PaintEventArgs e) { Pen myPen = new Pen(Color.Red); myPen.Width = 1; Graphics g = e.Graphics; int i, h1, h2, h = panel1.ClientSize.Height-1; int max = 0; for( i = 0; i < Len; i++ ) if( dataArray[i] > max ) max = dataArray[i]; for( i = 1; i < Len; i++ ) { h1 = h * dataArray[i-1] / max; h2 = h * dataArray[i] / max; g.DrawLine(myPen, (i-1)*20, h - h1, i*20, h - h2); g.DrawLine(myPen, i*20, h, i*20, 0); } } private void button2_Click(object sender, System.EventArgs e) { Random r = new Random(); for( int i = 0; i < Len; i++ ) dataArray[i] = 1; for( int i = 0; i < int.Parse(textBox1.Text); i++ ) { double f = r.NextDouble(); int k = 100; /// 以下是非线性随机数的算法二,产生线性递增分布的随机数 /// 原理忘记了 /// 单击该按钮可查看频度线 /// 改变k可改变起点的位置,范围从零到无穷大 /// 下面第二行是0起的简化形式 /// 详见DOC说明文件 int n = (int)( Math.Sqrt( k*k + 4*(Len+k)*Len*f ) / 2 - k/2.0 ); //int n = (int)( Math.Sqrt(f)*Len ); dataArray[n]++; } this.Refresh(); }