zoukankan      html  css  js  c++  java
  • C# 生成小于Int数值绝对值的随机数

    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 (numSeedslength);

      }

     

      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 = 0i < lengthi++) {

          randomResult |= ((uintbuffer[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 = (longmaxExclusiveValue - 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 (randomBytes0);

      }

     

      private byte[] GenerateRandomBytes (int bytesNumber) {

        byte[] buffer = new byte[bytesNumber];

        csp.GetBytes (buffer);

        return buffer;

      }

    }

     

    
    			
     

  • 相关阅读:
    C#.ToString()格式大全
    C# 中的正则验证及用法
    解除SVN的控制
    SVN检出忽略文件夹文件
    Mac下查看及生成SSH Key
    Xcode-报错问题总结大全
    CentOS6.5上kafka 安装过程-多机版本
    神经网络绘图网址
    CentOs 中没有eth0文件
    Spring 入门
  • 原文地址:https://www.cnblogs.com/ZQWelcomeIndex/p/9523499.html
Copyright © 2011-2022 走看看