黑马程序员技术交流社区
标题: C#写验证码问题 [打印本页]
作者: 董志 时间: 2011-12-13 18:38
标题: C#写验证码问题
本帖最后由 董志 于 2011-12-20 12:54 编辑
下面这段程序是用C#写验证码,单步调试结果正常,但是运行起来总是一串相同字符,望高手指点
(主界面一按钮,一个pictureBox)- private void button1_Click(object sender, EventArgs e)
- {
- Bitmap bmp = new Bitmap(200, 40);
- string code = null;
- List<string> chars = new List<string>();
- for (int i = 0; i < 10; i++) {
- chars.Add(i.ToString());
- }
- for (int i = 65; i < 90; i++) {
- chars.Add(Convert.ToChar(i).ToString());
- }
- for (int i = 0; i < 5; i++) {
- int n = new Random().Next(0, chars.Count);
- code += chars[n];
- }
- Graphics g = Graphics.FromImage(bmp);
- Color c1 = Color.FromArgb(new Random().Next(0, 150), new Random().Next(0, 150), new Random().Next(0, 150));
- Color c2 = Color.FromArgb(new Random().Next(0, 150), new Random().Next(0, 150), new Random().Next(0, 150));
- Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(new Point(0,0),new Point(100,100),c1,c2);
- g.DrawString(code, new Font("Arial", 20.0F), b, new Point(5,5));
- pictureBox1.Image = bmp;
- bmp.Save("code.jpg");
- }
复制代码
作者: 乔克 时间: 2011-12-13 19:33
- private void button1_Click(object sender, EventArgs e)
- {
- Bitmap bmp = new Bitmap(200, 40);
- string code = null;
- List<string> chars = new List<string>();
- for (int i = 0; i < 10; i++)
- {
- chars.Add(i.ToString());
- }
- for (int i = 65; i < 90; i++)
- {
- chars.Add(Convert.ToChar(i).ToString());
- }
- int n;
- int[] charIndexs = new int[5];
- int myIndex = 0;
- Random r = new Random();
- //生成五个不同的随机数。
- while (true)
- {
- int x = r.Next(0, chars.Count());
-
- if (charIndexs.Contains(x)) //如果已有该随机数,则继续下次循环
- continue;
- else
- {
- charIndexs[myIndex] = x; //如果没有该随机数,则保存到字典d中
- myIndex++;
- }
- if (myIndex >= 5) //5是你要的N个随机数,你可以把N改成你想要的随机数个数
- break;
- }
- for (int i = 0; i < 5; i++)
- {
-
- //n = r.Next(0, chars.Count());
- //n = new Random().Next(0, chars.Count);
- code += chars[charIndexs[i]];
- }
- Graphics g = Graphics.FromImage(bmp);
- Color c1 = Color.FromArgb(new Random().Next(0, 150), new Random().Next(0, 150), new Random().Next(0, 150));
- Color c2 = Color.FromArgb(new Random().Next(0, 150), new Random().Next(0, 150), new Random().Next(0, 150));
- Brush b = new System.Drawing.Drawing2D.LinearGradientBrush(new Point(0, 0), new Point(100, 100), c1, c2);
- g.DrawString(code, new Font("Arial", 20.0F), b, new Point(5, 5));
- pictureBox1.Image = bmp;
- bmp.Save("code.jpg");
- }
复制代码
作者: 余飞 时间: 2011-12-13 19:39
问题出在随机数获取上,改成下面的就OK了
Random random = new Random();
for (int i = 0; i < 5; i++)
{
int n =random.Next(0, chars.Count);
code += chars[n];
}
作者: 董志 时间: 2011-12-14 10:47
random 初始化在循环外面和在循环里面有什么深层次区别吗?
作者: liuyinggzu 时间: 2011-12-14 11:42
本帖最后由 liuyinggzu 于 2011-12-14 11:43 编辑
Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发那刻的系统时间做为种子,来产生一个随机数字,后者可以自己设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子,因此如果计算机运行速度很快,如果触发Random函数间隔时间很短,就有可能造成产生一样的随机数,因为伪随机的数字,在Random的内部产生机制中还是有一定规律的,并非是真正意义上的完全随机。
作者: 董志 时间: 2011-12-20 12:52
单步调试时,系统时间不一样了,所以产生了不一样的随i机数,运行时太快了,所以就会造成随机数相同。呵呵
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |