随机数的使用很普遍,可用它随机显示图片,用它防止无聊的人在论坛灌水还可以用来加密信息等等。本文讨论如何在一段数字区间内随机生成若干个互不相同的随机数,比如在从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;
}
最后就是要显示出来,当点击一个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()+"\n";
i++;
}
label1.Text=temp; //显示在label1中
}
随机数的作用不止如此,读者可用它进行游戏开发,安全验证等等,这有待读者去开发和实践。
原码如下:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace random
{
///
/// Form1 的摘要说明。
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label1;//
/// 必需的设计器变量。
///
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
///
/// 清理所有正在使用的资源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
///
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
///
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.label1 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(96, 32);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "随机数";
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// label1
//
this.label1.BackColor = System.Drawing.SystemColors.Desktop;
this.label1.ForeColor = System.Drawing.SystemColors.ActiveCaptionText;
分享到:
相关推荐
C#随机函数random()典型用法集锦
部分代码 private void number() { int random; Random R = new Random(); random = R.Next(0, 6); //。。。。。。。。。。。。。。
利用VS2005的C#语言编写的random随机函数算法的代码~~
代码如下: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’,’...
见帮助文档,简单再提一下,random(number)返回一个0~number-1之间的随机整数.参数number代表一个整数. 示例: trace(random(5)); 2、Math.random() 见帮助文档。返回一个有14位精度的0~1之间的数,注意没有参数。 示例...
math.random函数的一些用法技巧
一个函数,输入字符串位数,生产随机字符串,区分大小写
本文实例展示了C#自定义函数NetxtString实现生成随机字符串的方法,在进行C#项目开发中非常实用!分享给大家供大家参考。 一、生成随机字符串 关键代码如下: /// /// 生成随机字符串 /// /// <param name=random...
(1)利用随机函数rand()生成(0,1)区间的100个均匀分布随机数; (2)计算这100个均匀分布随机数的均值和方差, (3)将这100个均匀分布的随机数,及其均值和方差保存到文本文件 首先利用“srand((unsigned)time...
这是朋友拜托我做的,功能就是在现有的车牌号中随机抽取未使用的车牌,同时为了防止用户恶意刷号,每次抽取都需要输入验证码才行,随机的过程主要使用了random函数,代码听简单的,对做随机抽取的兔子可以参考下
本文实例讲述了C#实现对数组进行随机排序类。分享给大家供大家参考。... /// 使用Random类生成伪随机数 /// public class RandomHelper { //随机数对象 private Random _random; #region 构造函数 /// ///
在C#中有一个Random类,使用它可以很方便的生成随机数。其实一个最重要的生成方式就是给它一个最大值和一个最小值,系统可以自动生成该范围内的一个随机数字。 在创建Random对象的时候,需要赋值一个随机数种子。...
可以随机出100 以内的四则运算,主要应用伪随机数的函数
函数Random_Generator(int times); Times =用户要运行哈希函数以获取随机数的次数。 函数sha1(String s); 输入一个随机字符串。 在这个项目中,随机字符串不过是时期。 由于哈希函数不可逆,因此人们没有机会...
jrands 就是对 .NET 的 做另一个简单实现JS 写法let random = new jrands.Random(2)let i = random.next() + random.next()console.log(i)对应 C# 写法var r = new Random(2);var i = r.NextDouble() + r.NextDouble...
例使用C#实现了恺撒加密的算法,实例运行效果如图19.4 所示。 关 键技术 本实例实现时主要用到了string 类的ToCharArray 方法和Convert 类的ToChar 方法,下面分别对它们进行 详细介绍。 (1)string类的ToCharArray...
1.4.34 Random类——伪随机数生成器 75 1.4.35 Regex类——正则表达式 76 1.4.36 Split方法——分割字符串 78 1.4.37 String类——字符串 79 1.4.38 StringBuilder类——可变字符串 82 1.4.39 Substring方法——截取...
Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数. 代码如下: Random rd = new Random(); int i = rd.Next(); 这种随机数可以达到一些要求较低的目标,但是如果在高...
随机自动机简单的随机序列生成库。 基于下一个和下一个最近的相邻元胞自动机。 利用绝对规则编号 1436965290,在每次 get next 调用时跳过 4... 它具有重载的构造函数 RandomSequence (),它使用以系统时间作为种子的无