zoukankan      html  css  js  c++  java
  • 【扩展】随机数

    随机数的定义为:产生的所有数字毫无关系.

    1.随机数的原理:

    线性同余法:第n+1个数=(第n个数*29+37) % 1000

    编写一个自己的随机数类:

    class MyRand {
        private int seed;
        public MyRand(int seed) {this.seed = seed;} 
      public int Next()
       {
         int next = (seed * 29 + 37) % 1000;
         seed = next;
         return next;
      } 
    }

    2.Random 类生成随机数

    Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数.

    Random rd = new Random();
    int i = rd.Next();

    这种随机数可以达到一些要求较低的目标,但是如果在高并发的情况下,Random类所取到的系统时钟种子接近甚至完全一样,就很有可能出现重复,这里用循环来举例

    for (int i = 0; i < 10; i++)
    {
        Random rd = new Random();  //无参即为使用系统时钟为种子
        Console.WriteLine(rd.Next().ToString());
    }

    这个例子会输出10个相同的"随机数".

    突显出的问题:因为Random进行伪随机数的算法是固定的,所以根据同一个种子计算出的数字必然是一样的.而以当代计算机的运行速度,该循环几乎是在瞬间完成的,种子一致,所以会出现10次循环输出同一随机数的情况.

    因此

    在For循环中生成多个随机数的时候要把new Random()放到循环外面。

    3.如何生成真随机数?

    在Linux/Unix下可以使用"/dev/random"这个真随机数发生器,它的数据主来来自于硬件中断信息。

    Windows:CryptGenRandom()函数,主要依据当前进程Id、当前线程Id、系统启动后的TickCount、当前时间、QueryPerformanceCounter返回的高性能计数器值、用户名、计算机名、CPU计数器的值等等来计算。

    当然.Net下也可以使用RNGCryptoServiceProvider 类(System.Security.Cryptography命名空间下)来生成真随机数

    参考文章:《随机数是骗人的,.Net、Java、C为我作证》http://www.cnblogs.com/rupeng/p/3723018.html 

  • 相关阅读:
    python自学第13天 hashlib,re模块
    python自学第12天 模块
    python自学第12天 模块定义,导入,内置模块
    python自学第11天-单线程并发、迭代器,序列化,获取路径
    python自学第10天,生成器
    python自学第9天,装饰器
    python自学第8天,变量,递归
    python自学第7天,函数,参数
    彻底搞懂Session与Cookie的异同!
    你真的搞懂了Java中的<<、>>、>>>运算符嘛?
  • 原文地址:https://www.cnblogs.com/lolitagis02/p/8087564.html
Copyright © 2011-2022 走看看