当前位置:编程学习 > C#/ASP.NET >>

请问各位C#高手Random类如何使用!

小弟我初学C#,想产生随机数并保存在数组中,但是每次产生的随机数都是相同的,以下是我写的代码,请高手改正!谢谢!

using System;

namespace Test4
{
    public class MyClass
    {
        public static void Main(string[] args)
        {
            Console.Write("请输入要产生随机数的个数:");
            uint n = uint.Parse(Console.ReadLine());
            uint[] num=new uint[n];
            for (int i = 0; i < n; i++)
            {
                Random rnd = new Random();
                num[i] = (uint)(rnd.Next(0,100));
            }
            Console.WriteLine("产生的随机数为:");
            for (int i = 0; i < num.Length; i++)
            {
                Console.Write(num[i] + " ");
            }
            bool flag = false;
            Console.Write("\n请输入一个要查找的数:");
            uint search = uint.Parse(Console.ReadLine());
            for (int i = 0; i < num.Length; i++)
            {
                if (search == num[i])
                {
                    flag = true;
                    Console.Write("\n在数组的第{0}个位置找到了{1}", (i + 1), search);
                }
            }
            if (!flag)
            {
                Console.WriteLine("数组中没有这个数!");
            }
            Console.ReadLine();
        }
    }
} --------------------编程问答-------------------- http://www.cnblogs.com/doll-net/archive/2008/03/08/Random.html --------------------编程问答-------------------- 《一种生成不重复数的算法》: 
在编程中经常遇到一些类似的问题,比如做一个双色球选号软件,其中6个双色球是从1到33之间选出6个数来,这6个数是不能重复的,这个问题就是我们今天要说的生成不重复数算法。 
算法描述如下:从M个数中选出N个数来(0 <N <=M),要求N个数之间不能有重复。 
这个问题我以前用J2SE实现过,使用了ArrayList,每次随机在指定范围内选定一个数,然后查看结果集合中是否存在该数,如果存在继续下一轮循环,如果不存在,就将该数保存到结果集合中去。使用这种算法虽然也能实现要求,缺点是判断结果集合中是否存在该数时,需要通过一个循环来判断,这会增加算法运行的时间,虽然时间复杂度为n,但多次重复,还是一笔不小的开销。 

下面要介绍的算法是,每次随机取出一个数,之后将该数放置到集合的末尾去,这样下次取随机数的时候,只从1到目标集合个数-1个中随机抽取,如此循环,这样就避免了判断在结果集合中判断是否存在相冲突的数的过程。 
http://blog.csdn.net/zhoufoxcn/archive/2007/10/24/1842175.aspx  --------------------编程问答--------------------             for (int i = 0; i  < n; i++) 
            { 
                Random rnd = new Random(); 
                num[i] = (uint)(rnd.Next(0,100)); 
            } 
改成就可以了 (移到循环外):


            Random rnd = new Random();                  
            for (int i = 0; i  < n; i++) 
            { 
                num[i] = (uint)(rnd.Next(0,100)); 
            } 

--------------------编程问答-------------------- 解释:

Random rnd = new Random();  该命令用当前的时间作为种子来开始一系列'伪'随机数。
由于循环运行很快,在循环中构建的Random都具有相同的种子,他们生成的系列也就相同了。
--------------------编程问答--------------------  Random rnd = new Random();                  
            for (int i = 0; i  < n; i++) 
            { 
                num[i] = (uint)(rnd.Next(100)); 
            } 
--------------------编程问答-------------------- 谢谢各位高手的指点,小弟不胜感激 --------------------编程问答-------------------- 先介绍一下C#生成一个随机数的方法:

Random rdm = new Random();
int b = rdm.Next(0,100);  //从0到100的随机数

要生成即包含字符又包含数字的字符串也很简单,有一个方法:System.Guid.NewGuid()

System.Guid.NewGuid().ToString().Substring(0, 6);   //随机生成6位即包含字符又包含数字的字符串

  --------------------编程问答-------------------- Random rnd = new Random();
放在for语句上面即可 --------------------编程问答-------------------- 参考代码,
DateTime dateTimeMin = Convert.ToDateTime("2007-1-1");
DateTime dateTimeMax = Convert.ToDateTime("2007-12-31");

TimeSpan ts = dateTimeMax - dateTimeMin;
Random r = new Random();
int t1 = r.Next(1,(int)ts.TotalDays);            
DateTime newDT = dateTimeMin.Add(new TimeSpan(t1, 0, 0, 0));
DateTime newDT = dateTimeMin + new TimeSpan(t1, 0, 0, 0);//或这种方式 --------------------编程问答-------------------- 把Random r = new Random();改为带有种子的如下
Random r = new Random(DateTime.Now.Millisecond*DateTime.Now.Second);
 
--------------------编程问答-------------------- 把Random r = new Random();写在循环里,由于CPU太快而随机数的种子是当前时间,所以每次使用的种子都一样(产生的随机数的个数比较小的时候),产生的随机数就一样了。 --------------------编程问答-------------------- 学习。。。。。。。。 --------------------编程问答--------------------
引用 12 楼 skyaspnet 的回复:
学习。。。。。。。。

。 --------------------编程问答-------------------- 这帖可真有年头了... --------------------编程问答--------------------
引用 11 楼 gwl1984 的回复:
把Random r = new Random();写在循环里,由于CPU太快而随机数的种子是当前时间,所以每次使用的种子都一样(产生的随机数的个数比较小的时候),产生的随机数就一样了。


 学习了~ --------------------编程问答-------------------- 12楼挖坟,鉴定完毕 --------------------编程问答--------------------
引用 4 楼 gomoku 的回复:
解释:

Random rnd = new Random();  该命令用当前的时间作为种子来开始一系列'伪'随机数。
由于循环运行很快,在循环中构建的Random都具有相同的种子,他们生成的系列也就相同了。

正解 --------------------编程问答-------------------- Console.Write("请输入要产生随机数的个数:");
            uint n = uint.Parse(Console.ReadLine());
            uint[] num = new uint[n];
                Random rnd = new Random();//把这个拿出来就可以了,有的书上好象是讲过原理不记得
            for (int i = 0; i < n; i++)
            {
                num[i] = (uint)(rnd.Next(0, 100));
            }
            Console.WriteLine("产生的随机数为:");
            for (int i = 0; i < num.Length; i++)
            {
                Console.Write(num[i] + " ");
            }
            bool flag = false;
            Console.Write("\n请输入一个要查找的数:");
            uint search = uint.Parse(Console.ReadLine());
            for (int i = 0; i < num.Length; i++)
            {
                if (search == num[i])
                {
                    flag = true;
                    Console.Write("\n在数组的第{0}个位置找到了{1}", (i + 1), search);
                }
            }
            if (!flag)
            {
                Console.WriteLine("数组中没有这个数!");
            }
            Console.ReadLine(); 
--------------------编程问答--------------------
引用 7 楼 kcseason 的回复:
先介绍一下C#生成一个随机数的方法:

Random rdm = new Random();
int b = rdm.Next(0,100);  //从0到100的随机数

要生成即包含字符又包含数字的字符串也很简单,有一个方法:System.Guid.NewGuid()

System.Guid.NewGuid().ToString().Substring(0, 6);  //随机生成6位即包含字符又包含数字的字符串


好像要产生0至100的随机数
应该是:
int b = rdm.Next(0,101);  //从0到100的随机数

--------------------编程问答-------------------- Random rand=new Random();
int num=rand.next(随机数的起始位置,随机数的终止位置); --------------------编程问答-------------------- (new Random(Guid.NewGuid().GetHashCode())).Next(1, 100);
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,