如鹏网.Net基础1 随机数“骗局”揭秘

第 1 节 随机数有什么用、怎么用?

  .Net中创建随机数的方法:

1
2
Random rand =  new  Random();
Console.WriteLine(rand.Next());

  Java中创建随机数的方法:

1
2
3
Random rand =  new  Random(System.currentTimeMillis());
int  i = rand.nextInt();
System.out.println(i);

  C/C++中创建随机数的方法:

1
2
3
srand ((unsigned) time (NULL)); 
int  num =  rand ();
printf ( "%d\n" ,num);

 

 

------------------------------------------------
第 2 节 为什么每次生成的随机数都一样(跪求种子)

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

  随机数的原理:

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

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

1
2
3
4
5
6
7
8
9
10
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;
  
}

 

------------------------------------------------
第 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 

   知其然知其所以然!

如鹏网:http://www.rupeng.com

你可能感兴趣的:(如鹏网.Net基础1 随机数“骗局”揭秘)