Random 类

命名空间:System

表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。

伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并不具有完全的随机性,因为它们是用一种确定的数学算法选择的,但是从实用的角度而言,其随机程度已足够了。

伪随机数的生成是从种子值开始。如果反复使用同一个种子,就会生成相同的数字系列。产生不同序列的一种方法是使种子值与时间相关,从而对于 Random 的每个新实例,都会产生不同的系列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值,而参数化构造函数可根据当前时间的计时周期数采用 Int32 值。但是,因为时钟的分辨率有限,所以,如果使用无参数构造函数连续创建不同的 Random 对象,就会创建生成相同随机数序列的随机数生成器。

通过创建单个而不是多个 Random 对象可以避免此问题。

若要提高性能,请创建一个随时间推移能生成多个随机数的 Random 对象,而不要反复新建会生成同一个随机数的 Random 对象。

Random 成员

名称 ● 说明

Equals ● 确定指定的 Object 是否等于当前的 Object。(继承自 Object。)  Finalize ● 允许 Object 在“垃圾回收”回收 Object 之前尝试释放资源并执行其他清理操作。(继承自 Object。)  GetHashCode ● 用作特定类型的哈希函数。(继承自 Object。)  GetType ● 获取当前实例的 Type。(继承自 Object。)  MemberwiseClone ● 创建当前 Object 的浅表副本。(继承自 Object。)  Next ● 已重载。 返回随机数。  NextBytes ● 用随机数填充指定字节数组的元素。  NextDouble ● 返回一个介于 0.0 和 1.0 之间的随机数。  Sample ● 返回一个介于 0.0 和 1.0 之间的随机数。  ToString ● 返回表示当前 Object 的 String。(继承自 Object。)


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

我们可以使用两种方式初始化一个随机数发生器:

第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:

Random ro = new Random();

第二种方法可以指定一个int型参数作为随机种子:

int iSeed=;
Random ro = new Random();
long tick = DateTime.Now.Ticks;
Random ran = new Random((int)(tick & 0xffffffffL) | (int) (tick >> )); 这样可以保证99%不是一样。 之后,我们就可以使用这个Random类的对象来产生随机数,这时候要用到Random.Next()方法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。 不指定上下限的使用如下:
int iResult;
iResult=ro.Next(); 下面的代码指定返回小于100的随机数:
int iResult;
int iUp=;
iResult=ro.Next(iUp); 而下面这段代码则指定返回值必须在50-100的范围之内:
int iResult;
int iUp=;
int iDown=;
iResult=ro.Next(iDown,iUp); 除了Random.Next()方法之外,Random类还提供了Random.NextDouble()方法产生一个范围在0.-.0之间的随机的双精度浮点数:
double dResult;
dResult=ro.NextDouble(); 但是用Random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目是很难的。 参考了网上的一些方法,找到两类解决方法,一类是通过随机种子入手,使每一次的随机种子不同,来保证不重复;第二类是使用一些数据结构和算法。 下面主要就第二类介绍几个方法: 方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把随机抽取到的位置的索引号取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先把这100个数放在一个数组内,每次随机取一个位置(第一次是1-,第二次是1-,...),将该位置的数用最后的数代替。 int[] index = new int[];
for (int i = ; i < ; i++)
index = i;
Random r = new Random();
//用来保存随机生成的不重复的10个数
int[] result = new int[];
int site = ;//设置上限
int id;
for (int j = ; j < ; j++)
{
id = r.Next(, site - );
//在随机位置取出一个数,保存到结果数组
result[j] = index[id];
//最后一个数复制到当前位置
index[id] = index[site - ];
//位置的上限减少一
site--;
} 方法2:利用Hashtable。 Hashtable hashtable = new Hashtable();
Random rm = new Random();
int RmNum = ;
for (int i = ; hashtable.Count < RmNum; i++)
{
int nValue = rm.Next();
if (!hashtable.ContainsValue(nValue) && nValue != )
{
hashtable.Add(nValue, nValue);
Console.WriteLine(nValue.ToString());
}
} 方法3:递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。 Random ra=new Random(unchecked((int)DateTime.Now.Ticks));
int[] arrNum=new int[];
int tmp=;
int minValue=;
int maxValue=;
for (int i=;i<;i++)
{
tmp=ra.Next(minValue,maxValue); //随机取数
arrNum=getNum(arrNum,tmp,minValue,maxValue,ra); //取出值赋到数组中
}
.........
.........
public int getNum(int[] arrNum,int tmp,int minValue,int maxValue,Random ra)
{
int n=;
while (n<=arrNum.Length-)
{
if (arrNum[n]==tmp) //利用循环判断是否有重复
{
tmp=ra.Next(minValue,maxValue); //重新随机获取。
getNum(arrNum,tmp,minValue,maxValue,ra);//递归:如果取出来的数字和已取得的数字有重复就重新随机获取。
}
n++;
}
return tmp;
} silverlight Random 随机数解决方案 来源:我和未来有约会
-- : by nasa using System;
using System.Security.Cryptography; public class RNG
{
private static RNGCryptoServiceProvider rngp = new RNGCryptoServiceProvider();
private static byte[] rb = new byte[]; /// <summary>
/// 产生一个非负数的乱数
/// </summary>
public static int Next()
{
rngp.GetBytes(rb);
int value = BitConverter.ToInt32(rb, );
if (value < ) value = -value;
return value;
}
/// <summary>
/// 产生一个非负数且最大值在 max 以下的乱数
/// </summary>
/// <param name="max">最大值</param>
public static int Next(int max)
{
rngp.GetBytes(rb);
int value = BitConverter.ToInt32(rb, );
value = value % (max + );
if (value < ) value = -value;
return value;
}
/// <summary>
/// 产生一个非负数且最小值在 min 以上最大值在 max 以下的乱数
/// </summary>
/// <param name="min">最小值</param>
/// <param name="max">最大值</param>
public static int Next(int min, int max)
{
int value = Next(max - min) + min;
return value;
}
}

[转载]C# Random 生成不重复随机数的更多相关文章

  1. C# Random 生成不重复随机数

    命名空间:System 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. 伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,因为它们是用一种确定的数 ...

  2. C#生成不重复随机数列表

    C#生成不重复(随机数 http://www.jbxue.com/tags/suijishu.html)列表实例的代码.例子: ;             Random rnd = ; i <  ...

  3. mysql生成不重复随机数(unique number generation)

    转自:http://blog.csdn.net/dreamer2020/article/details/52049629 问题来源 业务中有时会遇到要生成不重复随机数的情况,例如,新生成一个商品编号. ...

  4. [转载][记录]javascript生成不重复的随机数

    参考链接:javascript生成不重复的随机数 项目播放视频,是无序的,有上下两个按钮,所以需要生成1,8不重复的随机数数组,如: ,,,,,,, 然后再split一次,就是数组了. 拿来主义了

  5. Python根据上下限生成不重复随机数1

    Python 2.7.5代码: #coding=utf-8 import random #定义计数器,默认为0 num=0 #定义随机结果集,默认为空列表 choose_resault=[] #最多可 ...

  6. 在使用Math.random()生成6位随机数遇到的问题,并成功得到6位随机数

    最近在做卫生局的一个考务网时需要实现一个短信发送验证码的功能,因此就必须使用到随机生成6位验证码的功能,开始觉的简单的,随便写了个 +); String messageCode = String.va ...

  7. PHP生成不重复随机数的方法

    无论是Web应用,还是WAP或者移动应用,随机数都有其用武之地.在最近接触的几个小项目中,我也经常需要和随机数或者随机数组打交道,所以,对于PHP如何产生不重复随机数常用的几种方法小结一下. 方法一: ...

  8. C#生成不重复随机数的方法

    在使用Random类生成随机数时,我们可能会碰到生成随机数重复的问题. 比如我们要生成6位数字验证码,虽然也是使用Random,但是可能出现111111,999999这样的情况. 这是因为在实例化Ra ...

  9. JS生成不重复随机数

    说明 我们可以用Math.random()的方法轻松的生成 一个随机的数字,但是这个数字可能是重复的.有时候,我们需要一个不重复的随机数,可以用很多的方法来实现这个要求,以下方法是效率最高的. 解释 ...

随机推荐

  1. java常用linux命令

    1.ifconfig查看ip 2.查询 例如:find / -name httpd.conf 3.查看是否有tomcat进程 ps –ef|grep tomcat 来查看是否有tomcat进程 4.杀 ...

  2. .net 文件操作

    一.DotNet文件目录常用操作: DiveInfo:提供了对逻辑磁盘的基本信息访问的途径.(只能查看信息,不能做任何修改.) System.Environment:用来枚举驱动器.(不能获取驱动器的 ...

  3. 对象创建型模式------Singleton(单例模式)

    地址:http://blog.csdn.net/wuzhekai1985/article/details/6665869.仅供自己参考学习. 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局节 ...

  4. js中对闭包的理解

    本人丝一枚,在刚刚过去的javascript学习中,对闭包这个知识真是,听课两分钟,懵逼一整天.今天闲来没事,看了下闭包.话不多说先上代码. <!DOCTYPE html> <htm ...

  5. 16_会话技术_Session案例

    [购物车中的信息保存] [Book.java] package com.Higgin.shopping; public class Book { private String id; private ...

  6. POJ 1088 滑雪 -- 动态规划

    题目地址:http://poj.org/problem?id=1088 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当 ...

  7. OS X平台上MySQL环境搭建

    参考资料: http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html http://blog.csdn.net/just ...

  8. 不同的extend 在调用构造函数时不同的写法

     /**  * jQuery.hhNewSilder 滚动图片插件  * User: huanhuan  * QQ: 651471385  * Email: th.wanghuan@gmail.com ...

  9. 简单易用的Rest

    今天碰巧,用到了淘宝的在线IP地址查询的Rest API,它提供接口给用户查询IP地址的归宿地.数据库比较庞大,准确性也比较高.地址为:http://ip.taobao.com/instruction ...

  10. css中>,+,~的用法

    1.>的用法 A>B选择A的所有子元素B(只选择一代) 2.+的用法 A+B选择紧随着A的兄弟元素B 3.~的用法 A~B选择位置处于A后面的所有兄弟元素B(不包含兄弟元素的子元素)