C# 生成随机数

本文探讨了在C#中生成随机数的各种方法,包括如何生成特定范围内的随机数及确保随机数的独特性。文中提供了实用代码示例,如生成指定长度的随机字符串和在指定区间内生成不重复的随机整数。
原文地址为: C# 生成随机数

  
private static char [] constant =
{
' 0 ' , ' 1 ' , ' 2 ' , ' 3 ' , ' 4 ' , ' 5 ' , ' 6 ' , ' 7 ' , ' 8 ' , ' 9 ' ,
' a ' , ' b ' , ' c ' , ' d ' , ' e ' , ' f ' , ' g ' , ' h ' , ' i ' , ' j ' , ' k ' , ' l ' , ' m ' , ' n ' , ' o ' , ' p ' , ' q ' , ' r ' , ' s ' , ' t ' , ' u ' , ' v ' , ' w ' , ' x ' , ' y ' , ' z ' ,
' A ' , ' B ' , ' C ' , ' D ' , ' E ' , ' F ' , ' G ' , ' H ' , ' I ' , ' J ' , ' K ' , ' L ' , ' M ' , ' N ' , ' O ' , ' P ' , ' Q ' , ' R ' , ' S ' , ' T ' , ' U ' , ' V ' , ' W ' , ' X ' , ' Y ' , ' Z '
};
public static string GenerateRandomNumber( int Length)
{
System.Text.StringBuilder newRandom
= new System.Text.StringBuilder( 62 );
Random rd
= new Random();
for ( int i = 0 ; i < Length; i ++ )
{
newRandom.Append(constant[rd.Next(
62 )]);
}
return newRandom.ToString();
}

      随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数,并通过此文介绍Visual c#中随机数的用法。
        .net.Frameword中提供了一个专门产生随机数的类System.Random,此类默认情况下已被导入,编程过程中可以直接使用。我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。

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

函数是这样用,比如100至999的随机数

  
Random ran = new Random();
int RandKey = ran.Next( 100 , 999 );


不过这样会有重复,可以给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)
{
int [] arr = getRandomNum( 6 , 1 , 20 ); // 从1至20中取出6个互不相同的随机数
int i = 0 ;
string temp = "" ;
while (i <= arr.Length - 1 ){
temp
= arr[i].ToString() " " ;
i ;
}
label1.Text
= temp; // 显示在label1中
}

转载请注明本文地址: C# 生成随机数
C#中,生成随机数有多种方法,以下为你详细介绍: ### 使用`System.Random`类 这是最常用的生成随机数的类,使用步骤如下: 1. **创建`Random`对象**:可通过无参构造函创建一个新的`Random`实例,它会使用与系统时钟相关的默认种子值。示例代码如下: ```csharp Random rd = new Random(); ``` 2. **生成随机数**: - **生成随机数**:可以使用`Next`方法,它有多种重载形式。例如,`Next()` 会生成一个非负的随机整;`Next(int maxValue)` 会生成一个大于等于 0 且小于 `maxValue` 的随机整;`Next(int minValue, int maxValue)` 会生成一个从 `minValue`(包括)到 `maxValue`(不包括)的随机整。示例代码如下: ```csharp // 生成一个非负随机整 int randomInt1 = rd.Next(); // 生成一个 0 到 100 之间(不包括 100)的随机整 int randomInt2 = rd.Next(100); // 生成一个 110 之间(包括 1 不包括 10)的随机整 int randomInt3 = rd.Next(1, 10); ``` - **生成浮点随机数**:使用`NextDouble`方法,它会返回一个大于等于 0.0 且小于 1.0 的随机浮点。示例代码如下: ```csharp double randomDouble = rd.NextDouble(); ``` 3. **注意事项**:如果在短时间内多次创建`Random`对象,可能会因为使用了相同的种子值而生成相同的随机数序列。所以,建议在程序中只创建一个`Random`对象并重复使用。 4. **示例代码**:生成一个包含 6 个随机整的列表。 ```csharp public List<int> RDNumber() { List<int> col = new List<int>(); Random rd = new Random(); // 只创建一个 Random 实例 for (int i = 0; i < 6; i++) { var a = rd.Next(); // 生成一个随机数 col.Add(a); } return col; } ``` ### 生成随机字符 利用 ASCII 码范围可以生成特定范围的随机字符串。例如,生成 a - z 的随机字符串(97 - 122 对应小写字母): ```csharp Random random5 = new Random(); string result = ""; for (int i = 0; i < 4; i++) { char c = (char)random5.Next(97, 123); // 生成 97 - 122 的随机数,转换为字符 result += c; } Console.WriteLine(result); // 例如:"kqzx" ``` ### 生成`byte`随机数 可以使用`NextBytes`方法生成指定长度的`byte`组。示例代码如下: ```csharp byte[] b = new byte[5]; Random rd = new Random(); rd.NextBytes(b); Console.WriteLine("产生的 byte 类型的值为:"); foreach (byte i in b) { Console.WriteLine(i); } ``` ### 使用`System.Security.Cryptography.RNGCryptoServiceProvider`类 这个类生成随机数是加密安全的,适用于对随机性要求较高的场景,如生成密码、密钥等。 - **详解为什么使用`RNGCryptoServiceProvider`**:`System.Random`类生成随机数是伪随机数,其生成算法是确定性的,在相同的种子下会生成相同的随机数序列。而`RNGCryptoServiceProvider`生成的是真正的随机数,基于操作系统的随机数生成器,具有更高的随机性和安全性。 - **如何使用`RNGCryptoServiceProvider`**:示例代码如下: ```csharp using System.Security.Cryptography; byte[] randomBytes = new byte[4]; using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider()) { rng.GetBytes(randomBytes); } int randomInt = BitConverter.ToInt32(randomBytes, 0); ``` - **注意事项**:使用`RNGCryptoServiceProvider`会比`System.Random`类更消耗性能,所以在对随机性要求不高的场景下,建议使用`System.Random`类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值