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. sping_依赖注入的三种方式

    1.  set注入:通过setxxx()给属性赋值 <!--id是对象--> <!--class是类--> <bean id = "student" ...

  2. 61.H5---利用canvas+原生js进行鼠标跟随绘图

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  3. Openrasp源码分析

    Openrasp是百度关于rasp技术的开源项目,由于工作需要,之前对rasp的源码进行了简单的分析.文章是之前就写好的,现在放出了,希望对大家有写帮助. OpenRASP中java引擎的源码分析 安 ...

  4. Dungeon Master (广搜)

    问题描述: You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed ...

  5. 【论文速读】Lianwen_Jin_CVPR2017_Deep_Matching_Prior_Network_Toward_Tighter_Multi-oriented_Text_Detection

    Lianwen_Jin_CVPR2017_Deep_Matching_Prior_Network_Toward_Tighter_Multi-oriented_Text_Detection 作者 关键词 ...

  6. Ubuntu14.04 安装 Sublime Text 3

    Linux下安装,一种办法是从官网下载 tar.bz ,手动安装.另一种是使用apt-ge安装 这里介绍用 apt-get 自动安装方法: 1.添加sublime text 3的仓库: sudo ad ...

  7. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

  8. linux单项目发布流程

    1.安装python #1.安装python3.7所需要的依赖包yum -y groupinstall "Development tools"yum -y install zlib ...

  9. animate.css 动画的使用

    $('#animatedClose').removeClass().addClass('fadeInDownBig animated').one('webkitAnimationEnd mozAnim ...

  10. Linux虚拟机配置(新猿旺学习总结)

    Linux系统环境部署 安装VMware虚拟机 选择安装位置要预留出20G虚拟机空间点击VM虚拟机安装包à一路下一步直至安装完成à进入界面 创建虚拟机 选择典型à找到安装镜像文件à安装机名称和位置选择 ...