C#中有两种类型的随机数生成器:

  • 伪随机数(System.Random)
  • 安全随机数(System.Security.Cryptography.RNGCryptoServiceProvider)

   关键的区别在于用于进行随机化的种子值可能不会快速且随机地变化。例如,System.Random依赖于计算机系统时钟

 public static class IntNumRandom {

  /// <summary>   

  /// 生成小于输入值绝对值的随机数   

  /// </summary>   

  /// <param name="NumSides"></param>   

  /// <returns></returns>   

  public static int Next (this int numSeeds) {

    numSeeds = Math.Abs (numSeeds);

    if (numSeeds <= 1) {

      return 0;

    }

 

    int length = 4;

    if (numSeeds <= byte.MaxValue) {

      length = 1;

    } else if (numSeeds <= short.MaxValue) {

      length = 2;

    }

 

    return Next (numSeeds, length);

  }

 

  private static int Next (int numSeeds, int length) {

    // Create a byte array to hold the random value.   

    byte[] buffer = new byte[length];

    // Create a new instance of the RNGCryptoServiceProvider.   

    System.Security.Cryptography.RNGCryptoServiceProvider Gen = new System.Security.Cryptography.RNGCryptoServiceProvider ();

    // Fill the array with a random value.   

    Gen.GetBytes (buffer);

    // Convert the byte to an uint value to make the modulus operation easier.   

    uint randomResult = 0x0; //这里用uint作为生成的随机数   

    for (int i = 0; i < length; i++) {

      randomResult |= ((uint) buffer[i] << ((length - 1 - i) * 8));

    }

    // Return the random number mod the number   

    // of sides.  The possible values are zero-based   

    return (int) (randomResult % numSeeds);

  }

 

}

 

public class RandomGenerator {

  readonly RNGCryptoServiceProvider csp;

 

  public RandomGenerator () {

    csp = new RNGCryptoServiceProvider ();

  }

 

  public int Next (int minValue, int maxExclusiveValue) {

    if (minValue >= maxExclusiveValue)

      throw new ArgumentOutOfRangeException ("minValue must be lower than maxExclusiveValue");

 

    long diff = (long) maxExclusiveValue - minValue;

    long upperBound = uint.MaxValue / diff * diff;

 

    uint ui;

    do {

      ui = GetRandomUInt ();

    } while (ui >= upperBound);

    return (int) (minValue + (ui % diff));

  }

 

  public uint GetRandomUInt () {

    var randomBytes = GenerateRandomBytes (sizeof (uint));

    return BitConverter.ToUInt32 (randomBytes, 0);

  }

 

  private byte[] GenerateRandomBytes (int bytesNumber) {

    byte[] buffer = new byte[bytesNumber];

    csp.GetBytes (buffer);

    return buffer;

  }

}

 


 

C# 生成小于Int数值绝对值的随机数的更多相关文章

  1. js中Math.random()生成指定范围数值的随机数

    http://www.111cn.net/wy/js-ajax/57062.htm Math.random() 这个方法相信大家都知道,是用来生成随机数的.不过一般的参考手册时却没有说明如何用这个方法 ...

  2. JS对象随机数 random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数。 注意:返回一个大于或等于 0但小于1的符号为正的数值

    随机数 random() random() 方法可返回介于 0 ~ 1(大于或等于 0 但小于 1 )之间的一个随机数. 语法: Math.random(); 注意:返回一个大于或等于 0 但小于 1 ...

  3. 生成N个不相等的随机数

    近期项目中须要生成N个不相等的随机数.实现的时候.赶工期,又有项目中N非常小(0-100)直接谢了一个最直观的方法: public static List<Integer> randomS ...

  4. PHP函数:生成N个不重复的随机数

    思路:将生成的随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. 程序: <?php /* * array unique_rand( int $min, int $max, ...

  5. 生成N个不重复的随机数(转)

    有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? 当然向上级反映情况.但是 ...

  6. PHP CodeBase: 生成N个不重复的随机数

    有25幅作品拿去投票,一次投票需要选16幅,单个作品一次投票只能选择一次.前面有个程序员捅了漏子,忘了把投票入库,有200个用户产生的投票序列为空.那么你会如何填补这个漏子? <?php /* ...

  7. 使用C++生成1-33中的6个随机数,无重复

    生成1-33中的6个随机数,无重复 ------------------------------------------------------------------------   方法1.每生成 ...

  8. php生成N个不重复的随机数实例

    思路: 将随机数存入数组,再在数组中去除重复的值,即可生成一定数量的不重复随机数. /* * array unique_rand( int $min, int $max, int $num ) * 生 ...

  9. 函数:生成n个互不相同的随机数,最大值为upper

    参考:http://blog.csdn.net/zhangkaihang/article/details/6836506 函数getRandArray()功能说明: 入参:int upper-生成的随 ...

随机推荐

  1. for循环的beak continue用法

    continue跳出该循环, for循环后面的都要执行.break直接中段循环 后面不执行了

  2. Azure架构(一):云计算基础

    云计算的定义 云计算(英语:cloud computing),是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需求提供给使用各种计算终端(桌面电脑.笔记本电脑.平板电脑.手机等) ...

  3. Oracle 12.2报错ORA-15032、ORA-15410或ORA-15411解决

    现象:在Oracle 12.2.0.1 RAC环境,在其ASM实例中,如果添加不同大小或者不同数量的LUN到failgroup中,会报错: ORA-15032: not all alterations ...

  4. GIT学习总结--从git上拉取代码到本地

    步骤: 1.输入公司的git地址https://git5b.XXXXX.com,回车: 2.在登录框中输入用户名和密码: 3.选取需要的文件下的代码 4.复制该项目的地址 5.在本地的windows命 ...

  5. 详解UML中的6大关系(关联、依赖、聚合、组合、泛化、实现)

      UML中的6大关系相关英文及音标: 依赖关系 dependency --------> 关联关系 association ______> 聚合关系 aggregation ______ ...

  6. 基于C#的Appium自动化测试框架(Ⅰ):程序结构

    因为工作原因,使用的编程语言都是C#,但是国内相应的Appium资料少得可怜,Java版本的Appium也考虑过,但是奈何自己搞不定Eclipse这个编译环境[说白了就是因为懒…… 无意中看到了外面的 ...

  7. sql server中的while循环语句

    语法格式: while 条件 begin ....... end declare @num begin update SDetail end

  8. listener 监听 tomcat 容器的初始化和销毁

    为了简单,就写个统计Action 请求数量的例子: 1.首先写个 listener public class TestServletContextListener implements Servlet ...

  9. 网络-02-端口号-linux端口详解大全

    端口详解 1 tcpmux TCP Port Service Multiplexer 传输控制协议端口服务多路开关选择器  2 compressnet Management Utility compr ...

  10. iOS 小米推送总结和遇到的坑

    极光推送就不赘述了,这里说下小米推送在ios上的坑吧,查了好久也没有查到相关的文章. 极光的强大就不说了,当客户贪图实惠的时候,当人家给你让你用小米推送的时候,我的内心是崩溃的,小米推送???没听过! ...