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. datetime模块处理时间

    python常用的处理时间的库有:datetime,time,calendar.datetime库包括了date(储存日期:(年.月.日),time(储存时间:(小时.分.秒和微秒),timedelt ...

  2. if __name__ == '__main__' 这段代码怎么理解???

    __name__是内置变量,可用于表示当前模块的名字,而“__main__”等于当前执行文件的名称. 两个名称搞不清没关系,往下看待会解释 对很多编程语言来说,程序都需要一个入口,例如C系列.Java ...

  3. 初学Python(二)

    -----------------------------------------------------2019.3.5-00:59--------------------------------- ...

  4. 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法

    在操作已经创建好的数据库时,若是添加新的实体类或者修改原有数据库上下文,会报如下错误: The model backing the 'StudentDbContext' context has cha ...

  5. Asp.net Image控件显示Bitmap生成图像

    from:https://blog.csdn.net/qq_29011299/article/details/81137980 using(Bitmap bmp=new Bitmap(300,50)) ...

  6. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  7. 软件工程实践助教每周小结 < 福州大学 | 傅明建 >

    第一周助教小结 1. 助教博客链接: http://www.cnblogs.com/sinceway/ 2. 本周点评的作业数量:约22份,有多次交互 3. 本周点评有困难的作业链接: https:/ ...

  8. REST AND SOAP

    REST,即Representational State Transfer的缩写.直接翻译的意思是"表现层状态转化".它是一种互联网应用程序的API设计理念:URL定位资源,用HT ...

  9. 克服"水土不服",融云助攻小象直播杀破"出海重围"

    2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机.然而,直播行业作为泛娱乐的模式之一,其实本身“未死 ...

  10. JS所包含的大纲内容,以及JS中数据类型、运算符的介绍

    JavaSctipt javascript:1.特效2.表单验证 原理:何时?1.找到标签 何时?2.操作标签 写在那里? 内联(行内)(不推荐直接写js代码,经常写方法调用) 写在标签里面,以属性的 ...