C# 随机数 数组定义和初始化

http://www.cnblogs.com/sutengcn/archive/2006/04/22/382132.html

http://www.cnblogs.com/diction/archive/2007/09/30/911695.html

 

随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数,并通过此文介绍Visual c#中随机数的用法。

 

.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;

}

 

数组是具有相同数据类型的项的有序集合。要访问数组中的某个项,需要同时使用数组名称及该项与数组起点之间的偏移量。在 C# 中,声明和使用数组的方法与 Java 有一些重要区别。 

一维数组 
一维数组以线性方式存储固定数目的项,只需一个索引值即可标识任意一个项。在 C# 中,数组声明中的方括号必须跟在数据类型后面,且不能放在变量名称之后,而这在 Java 中是允许的。因此,类型为 integers 的数组应使用以下语法声明: 

int[] arr1;

下面的声明在 C# 中无效: 

//int arr2[]; //compile error

声明数组后,可以使用 new 关键字设置其大小,这一点与 Java 相同。下面的代码声明数组引用: 

int[] arr; 
arr = new int[5]; // create a 5 element integer array

然后,可以使用与 Java 相同的语法访问一维数组中的元素。C# 数组索引也是从零开始的。下面的代码访问上面数组中的最后一个元素: 

System.Console.WriteLine(arr[4]); // access the 5th element

初始化 

C# 数组元素可以在创建时使用与 Java 相同的语法进行初始化: 

int[] arr2Lines; 
arr2Lines = new int[5] {1, 2, 3, 4, 5};

但 C# 初始值设定项的数目必须与数组大小完全匹配,这与 Java 不同。可以使用此功能在同一行中声明并初始化 C# 数组: 

int[] arr1Line = {1, 2, 3, 4, 5};

此语法创建一个数组,其大小等于初始值设定项的数目。 

在程序循环中初始化 
在 C# 中初始化数组的另一个方法是使用 for 循环。下面的循环将数组的每个元素都设置为零: 

int[] TaxRates = new int[5]; 

for (int i=0; i<TaxRates.Length; i++) 

TaxRates[i] = 0; 
}

交错数组 
C# 和 Java 都支持创建交错(非矩形)数组,即每一行包含的列数不同的数组。例如,在下面的交错数组中,第一行有四项,而第二行有三项: 

int[][] jaggedArray = new int[2][]; 
jaggedArray[0] = new int[4]; 
jaggedArray[1] = new int[3];

多维数组 
可以使用 C# 创建规则的多维数组,多维数组类似于同类型值的矩阵。虽然 Java 和 C# 都支持交错数组,但 C# 还支持多维数组(数组的数组)。 

使用以下语法声明多维矩形数组: 

int[,] arr2D; // declare the array reference 
float[,,,] arr4D; // declare the array reference

声明之后,可以按如下方式为数组分配内存: 

arr2D = new int[5,4]; // allocate space for 5 x 4 integers

然后,可以使用以下语法访问数组的元素: 

arr2D[4,3] = 906;

由于数组是从零开始的,因此此行将第四行第五列中的元素设置为 906。 

初始化 
可以使用以下一种方法,在同一个语句中创建、设置并初始化多维数组: 

int[,] arr4 = new int [2,3] { {1,2,3}, {4,5,6} }; 
int[,] arr5 = new int [,] { {1,2,3}, {4,5,6} }; 
int[,] arr6 = { {1,2,3}, {4,5,6} };

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值