C#随机数的使用

随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从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;

}

时间: 2024-10-26 05:14:44

C#随机数的使用的相关文章

c++-怎样产生同时两个随机数

问题描述 怎样产生同时两个随机数 我想做两个随机数的乘法,但不知道怎么才能同时产生两个随机数,求各位帮忙 解决方案 没有必要所谓同时产生.你前后产生2个就可以了. 解决方案二: 为什么要同时生成?分两次srand就可以了 解决方案三: c++估计没有这么智能,但是又种软件叫labview的编程语言,可以让2个线程运行在两个核上分别产生随进数,然后用两个线程产生的结果来相乘.本人有段时间不搞c++不知道线程有没有什么法子能让两个线程运行在2个核上 解决方案四: 当你在同一单线程程序里,怎么会同时呢

用C#生成不重复的随机数

对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数.伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了.伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地"随机",随机种子的选择就显得非常重要.如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样.一

shell如何生成指定范围随机数与随机字符串

1.使用系统的 $RANDOM 变量 fdipzone@ubuntu:~$ echo $RANDOM 17617 $RANDOM 的范围是 [0, 32767] 如需要生成超过32767的随机数,可以用以下方法实现. 例:生成400000~500000的随机数 #!/bin/bash function rand(){ min=$1 max=$(($2-$min+1)) num=$(($RANDOM+1000000000)) #增加一个10位的数再求余 echo $(($num%$max+$min

MySQL随机数的实现

SELECT FLOOR(7 + (RAND() * 6)); 在一个范围随机产生 一个数字 ------------------------------------------------------- 有朋友问到如何在mysql中使用随机数   如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写一个循环一次更新一条信息,这样我知道用WHILE写就可以了,要是一次更新好比100条数据改如何

ASP的随机数的应用技术

随机 关于随机数,请参看以下资料: Rnd 函数 描述 返回一个随机数. 语法 Rnd[(number)] number 参数可以是任意有效的数值表达式. 说明 Rnd 函数返回一个小于 1 但大于或等于 0 的值. number 的值决定了 Rnd 生成随机数的方式: 如果 number 为 Rnd 生成 小于零 每次都相同的值,使用 number 作为种子. 大于零 序列中的下一个随机数. 等于零 最近生成的数. 省略 序列中的下一个随机数. 因每一次连续调用 Rnd 函数时都用序列中的前一

Javascript 生成指定范围数值随机数 By shawl.qiu

javascript|随机 说明:俺本来以为 Js 的随机数应该没啥, 查查手册就得了. 查手册后才知道, 介绍的信息少得可怜呐, 没有介绍生成 m-n 范围的随机数..., 就只是给你一个 Math.random() 了事. 不过经过俺的小小努力之后, 终于让俺摸着门道喽, 问题也就理所当然滴解决掉.  然后就写了个公式, 这样应该可以消失掉这个用法了, 公式: 1. 从1开始 至 任意值linenum parseInt(Math.random()*上限+1); 2. 从任意值开始 至 任意值

生成任意位随机数的函数

函数|随机 生成任意位随机数的函数'strLong是随机数字的位数,数字型Function rndNum (strLong) Dim temNum Randomize Do While Len(RndNum) < strLong temNum=CStr(Chr((57-48)*rnd+48)) RndNum=RndNum&temNum loopEnd Function

J2ME中随机数字处理全攻略

攻略|随机|随机数字 在程序中生成随机数字,用处比较,如人工智能领域等等,这里对于在J2ME中生成随机数的操作进行一个简单的整理,希望对大家能有帮助.       J2ME和J2SE不同,不能使用Math类的random来生成随机数字,只能使用java.util包的Random类来生成随机数字.       1.创建Random类型的对象:       Random random = new Random();Random random = new Random(10010010);以上两种是创

用ASP随机产生随机数

各位好今天我要告诉大家的是如何用ASP产生随机数.大家都知道大多数网站注册后 提供用户名和一个随机密码,但这个密码是如何产生的,现在我就向大家来介绍一下 请看下面的例子,用户可自行增加或减少随机的字符或数量. <%Function gen_key(digits) 'Create and define arraydim char_array(50)char_array(0) = "0"char_array(1) = "1"char_array(2) = &quo

正态分布的随机数发生器 in C#

随机 Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法.设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立. 主要参考<Numerical Recipes in C++ 2/e>p.292-p.294 和<Simulation Modeling and Analysis 3/e>p.465-p.466. Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法.设 U1,