请教一个关于随机数的问题,比如
Random ra = new Random();
int a = ra.Next(0, 10);
现在想Radom一个rb,范围是0到10但是除去ra,请问一下该如何实现..
类似的,rc,范围也是0到10,但是除去ra和rb,该如何实现..
解决方案 »
- WebServices调用时RSA问题
- 使用using,的时候如果出现异常的话那么using内部的比如myConnection 资源会被释放掉吗,就算我写dispose
- 主窗体上的用户控件如何调用主窗体的public方法
- 奇怪的小问题!双引号
- BindingSource 如何与 textBox1.DataBindings建立起来关联?(2005里面)
- C#控制Word打开文档后,如何设置文档不可编辑?
- 怎么在C#中加入C++的DLL
- C# 改写VC代码
- Visual Studio 2008 C#代码编辑器 乱码
- 窗体事件问题?
- C#新手再次请教一个关于生成随机数的问题
- vs2005 启动项 的小问题?
什么具体的需求吗?
发过来.是rb生成的随机数,不包含ra生成的有机数吗?
是rc生成的随机数,不包含rb生成的有机数吗?
我们可以用以下两种方法初始化一个随机数发生器;
第一种方法不指定随机种子,系统自动选取当前时前作随机种子: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{/// <summary>/// Form1 的摘要说明。/// </summary>public class Form1 : System.Windows.Forms.Form{private System.Windows.Forms.Button button1;private System.Windows.Forms.Label label1;/// <summary>/// 必需的设计器变量。/// </summary>private System.ComponentModel.Container components = null;public Form1(){//// Windows 窗体设计器支持所必需的//InitializeComponent();//// TODO: 在 InitializeComponent 调用后添加任何构造函数代码//}/// <summary>/// 清理所有正在使用的资源。/// </summary>protected override void Dispose( bool disposing ){if( disposing ){if (components != null){components.Dispose();}}base.Dispose( disposing );}#region Windows Form Designer generated code/// <summary>/// 设计器支持所需的方法 - 不要使用代码编辑器修改/// 此方法的内容。/// </summary>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;this.label1.Location = new System.Drawing.Point(49, 112);this.label1.Name = "label1";this.label1.Size = new System.Drawing.Size(168, 80);this.label1.TabIndex = 1;this.label1.Text = "label1";//// Form1//this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);this.ClientSize = new System.Drawing.Size(292, 273);this.Controls.AddRange(new System.Windows.Forms.Control[] {this.label1,this.button1});this.Name = "Form1";this.Text = "Form1";this.ResumeLayout(false);}#endregion/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){Application.Run(new Form1());}private void button1_Click(object sender, System.EventArgs e){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;}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;}public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra){//Random ra=new Random(unchecked((int)DateTime.Now.Ticks));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;}}}public int[] getRandomNum2(int num,int minValue,int maxValue)
{
Random ra=new andom(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[num];
int tmp=0;
bool notRepeat;for (int i=0;i<=num-1;)
{
tmp=ra.Next(minValue,maxValue); //随机取数
notRepeat=true;
for( int j=0; j<i; j++ )
if( tmp == arrNum[j] )
{
notRepeat = false;
break;
}
if( notRepeat ) arrNum[i++] = tmp;
}
return arrNum;
}
参考如下代码
public static int[] RandomNumbers(int ACount, int AMinValue, int AMaxValue)
{
if (ACount <= 0) return null;
if (AMaxValue < AMinValue) // 确保vMinValue小于vMaxValue
AMinValue = AMaxValue | (AMaxValue = AMinValue) & 0;
if (ACount > AMaxValue - AMinValue + 1) return null; // 取的个数多余范围就算了
List<int> vValues = new List<int>();
for (int i = AMinValue; i <= AMaxValue; i++)
vValues.Add(i); // 得到一个完整顺序排列的数组
int[] Result = new int[ACount];
Random vRandom = new Random();
for (int i = 0; i < ACount; i++)
{
int j = vRandom.Next(vValues.Count);
Result[i] = vValues[j];
vValues.RemoveAt(j); // 抽取后删除
}
return Result;
}private void button1_Click(object sender, EventArgs e)
{
foreach (int i in RandomNumbers(5, 1, 10))
{
Console.WriteLine(i);
}
}
using System.Collections.Generic;
public class TestList
{
public static void Main()
{
List<int> aa = new List<int>();
for (int i = 0; i <10; i++)
{
aa.Add(i);// 0,1, 2, 3, 4, 5, 6, 7, 8, 9;
}
List<int> bb = new List<int>();
Test(aa, bb);
foreach(int i in bb)
{
Console.WriteLine(i);
}
Console.ReadLine();
}
public static void Test(List<int> aa, List<int> bb)
{
if (aa.Count == 0) return;
Random ra = new Random();
int a = ra.Next(aa.Count);
bb.Add(aa[a]);
for (int i = 0; i < aa.Count; i++)
{
if (aa[i] == aa[a])
{
aa.RemoveAt(i);
}
}
Test(aa, bb);
}
};aa去掉随机数。。bb加 入获取的随机数
{
Console.WriteLine(string.Format("{0}{1}{2}", DateTime.Now.ToString("yyMMddHHmmss"),
DateTime.Now.ToString("FFFF").PadRight(4, '0'), rand.Next(9999).ToString().PadRight(4, '0')));
} private Random rand = new Random();