A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王杨武 中级黑马   /  2012-9-13 20:45  /  2437 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

C++中好像有个rand();函数可以随机生成一些数字。
那C#中的又是什么呢?要详细的用法。
{:soso_e200:}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

5 个回复

正序浏览
随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。.net.Frameword中提供了一个专门产生随机数的类System.Random,此类默认情况下已被导入,编程过程中可以直接使用。我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。

我们可以用以下两种方法初始化一个随机数发生器;

第一种方法不指定随机种子,系统自动选取当前时前作随机种子:

Random ra=new Random();

第二种方法是指定一个int型的参数作为随机种子:

int iSeed=6;

Random ra=new Random(iSeed);

下面我们要用到Random.Next()方法产生随机数。

ra.Next();

它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

public virtual int Next(int);

用法:ra.next(20)

返回一个小于所指定最大值(此处为20)的正随机数。

public virtual int Next(int minValue, int maxValue);

用法:ra.next(1,20)

返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。

类System.Random还有几个方法分别是:

公共方法:

NextBytes用随机数填充指定字节数组的元素。

NextDouble返回一个介于 0.0 和 1.0 之间的随机数。

受保护的方法:

Sample返回一个介于 0.0 和 1.0 之间的随机数,只允许子类对象访问。

以上介绍了随机数的基本用法,下面我们用一个实例来做更进一步的介绍。要在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数。

主要是下面两个函数getRandomNum与getNum:

public int[] getRandomNum(int num,int minValue,int maxValue)

{

    Random ra=new Random(unchecked((int)DateTime.Now.Ticks));

    int[] arrNum=new int[num];

    int tmp=0;



    for (int i=0;i<=num-1;i++)

    {

        //随机取数

        tmp=ra.Next(minValue,maxValue);

        //取出值赋到数组中

        arrNum[i]=getNum(arrNum,tmp,minValue,maxValue,ra);

    }



    return arrNum;

}



getRandomNum即是在区间[minValue,maxValue]取出num个互不相同的随机数,返回的数组包含着结果。


其中随机数是这样创建的 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));为什么不用Random ra=new Random();(系统自动选取当前时前作随机种子)呢?

用系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,Random 的不同实例的种子值可能相同。这种情况下,我们就需要另外的算法来保证产生的数字的随机性。所以为了保证产生的随机数足够"随机",我们不得不使用复杂一点的方法来获得随机种子。在上面的这段程序中,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够"随机"的随机数。

函数getNum是一递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。值得注意的是要用一同一个随机数实例生成,所以ra要作为参数传入getNum中,否则生成的数字会有重复。

public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)

{

    int n=0;

    while (n<=arrNum.Length-1)

    {

        if (arrNum[n]==tmp) //利用循环判断是否有重复

        {

            //重新随机获取。

            tmp=ra.Next(minValue,maxValue);

            //递归:如果取出来的数字和已取得的数字有重复就重新随机获取。

            getNum(arrNum,tmp,minValue,maxValue,ra);

        }



        n++;

    }



return tmp;

}



最后就是要显示出来,当点击一个button时取出的数字显示在一个label中。


private void button1_Click(object sender, System.EventArgs e)

{

    //从1至20中取出6个互不相同的随机数

    int[] arr=getRandomNum(6,1,20);

    int i=0;

    string temp="";



    while (i<=arr.Length-1)

    {

        temp+=arr[i].ToString()+"\n";

        i++;

    }



    label1.Text=temp; //显示在label1中

}



随机数的作用不止如此,可用它进行游戏开发,安全验证等等

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报

(1)Random rnd = new Random();  
int rndNum = rnd.Next();           //int 取值范围内的随机数  
int rndNum = rnd.Next(10);         //得0~9的随机数  
int rndNum = rnd.Next(10,20);      //得10~19的随机数  
int rndNum = rnd.NextDouble();     //得0~1的随机数
如果往数据库里插入一个不重复的随机数,SQLSERVER用newid()那是相当的简单.
access就只能用Random()了.而且ACEESS插入一个不重复随机数的时候要注意{}括号的使用.
(2)Random ran=new Random(seed);  
int num=ran.Next(a,b);  
seed-种子  
a-随机数最小值,b-随机数最大值  
(3)函数是这样用,比如100至999的随机数  
Random ran=new Random();  
int RandKey=ran.Next(100,999);  
不过这样会有重复,可以给Random一个系统时间做为参数,以此产生随机数,就不会重复了  

System.Random a=new Random(System.DateTime.Now.Millisecond);  
int RandKey =a.Next(10);  
(4)Random rnd = new Random();  
int rndNum = rnd.Next();        //int 取值范围内的随机数  
int rndNum = rnd.Next(10);      //得0~9的随机数  
int rndNum = rnd.Next(10,20);   //得10~19的随机数  
int rndNum = rnd.NextDouble(); //得0~1的随机数

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
Random 的各种方法。。。看看这个例子吧
byte[] bytes1 = new byte[100];
byte[] bytes2 = new byte[100];
Random rnd1 = new Random();
Random rnd2 = new Random();

rnd1.NextBytes(bytes1);
rnd2.NextBytes(bytes2);

Console.WriteLine("First Series:");
for (int ctr = bytes1.GetLowerBound(0);
     ctr <= bytes1.GetUpperBound(0);
     ctr++) {
   Console.Write("{0, 5}", bytes1[ctr]);
   if ((ctr + 1) % 10 == 0) Console.WriteLine();
}
Console.WriteLine();
Console.WriteLine("Second Series:");        
for (int ctr = bytes2.GetLowerBound(0);
     ctr <= bytes2.GetUpperBound(0);
     ctr++) {
   Console.Write("{0, 5}", bytes2[ctr]);
   if ((ctr + 1) % 10 == 0) Console.WriteLine();
}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
函数是这样用,比如产生一个100至1000的随机数
Random ran=new Random();
int RandKey=ran.Next(100,1001);

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
C#中 Random r=new Random();  
用对象名可以点出方法和属性

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马