# 随机数是骗人的，.Net、Java、C为我作证

 ```Random rand = newRandom(); ``` ```Console.WriteLine(rand.Next()); ```

Next()方法用来返回一个随机数。相同的代码你执行和我的结果非常可能不一样，并且我多次执行的结果也非常可能不一样，这就是随机数。

 `for``(``int` `i=0;i<100;i++) ` `{ ` `    ````Random rand = ````new` ```Random(); ``` `    ````Console.WriteLine(rand.Next()); ``` `}`

 ```Random rand = newRandom(); ``` `for``(``int` `i=0;i<100;i++) ` `{             ` `    ````Console.WriteLine(rand.Next()); ``` `} `

 `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; ` `  ````} ``` `} `

 ```MyRand rand = newMyRand(51); ``` `for` ``` (````int` ```i = 0; i < 10; i++) ``` ` ````{ ``` `    ````Console.WriteLine(rand.Next()); ``` ` ````} ```

 ```MyRand rand = newMyRand(Environment.TickCount); ``` `for` ``` (````int` ```i = 0; i < 10; i++) ``` ` ````{ ``` `    ````Console.WriteLine(rand.Next()); ``` ` ````} ```

Environment.TickCount为"系统启动后经过的毫秒数"。这样每次程序执行的时候Environment.TickCount都不大可能一样（靠手动谁能一毫秒内启动两次程序呢），所以每次生成的随机数就不一样了。

?

 `for` ``` (````int` ```i = 0; i < 100; i++) ``` ` ````{ ``` `    ````MyRand rand = newMyRand(Environment.TickCount); ``` `    ````Console.WriteLine(rand.Next()); ``` ` ````} ```

public Random(int Seed)

public Random() : this(Environment.TickCount)

{

}

 `int` ``` i; ``` `for````(i=0;i<10;i++) ``` `{ ` `    ``srand``( (unsigned)``time````( NULL ) ); ``` `    ``printf``(``"%d\n"``,``rand````()); ``` `} `

 `srand``( (unsigned)``time````( NULL ) ); ````//把当前时间设置为"随机数种子" ` `int` ``` i; ``` `for````(i=0;i<10;i++) ``` `{          ` `    ``printf``(``"%d\n"``,``rand````()); ``` `} `

Java学习者可能会提出问题了，在Java低版本号中，例如以下使用会像.Net、C/C++中一样产生同样的随机数：

?

 `for``(``int` `i=``0``;i<``100````;i++) ``` `{ ` `    ````Random rand = ````new` `Random(); ` `    ````System.out.println(rand.nextInt()); ``` `} `

public Random() { this(System.currentTimeMillis()); }

 `public` ``` Random() ``` `{ ` `this````(seedUniquifier() ^ System.nanoTime()); ``` `}
` `private` `static` `long` `seedUniquifier() { ` `for` ``` (;;) { ``` `long` ``` current = seedUniquifier.````get````(); ``` `long` ``` next = current * 181783497276652981L; ``` `if` ``` (seedUniquifier.compareAndSet(current, next)) ``` `return` `next; ` ` ````} ``` ` ````} ``` ```privatestaticfinal AtomicLong seedUniquifier  = ````new` ```AtomicLong(8682522807148012L); ```

Random rand = new Random();

Int code = rand.Next();

1. 把Random对象作为一个全局实例（static）来使用。Java中Random是线程安全的（内部进行了加锁处理）；.Net中Random不是线程安全的，须要加锁处理。只是加锁会存在会造成处理速度慢的问题。并且因为初始的种子是确定的，所以攻击者存在着依据得到的若干随机数序列猜測出"随机数种子"的可能性。
2. 由于每次生成Guid的值都不样，网上有的文章说能够创建一个Guid计算它的HashCode或者MD5值的方式来做种子： new Random(Guid.NewGuid().GetHashCode()) 。可是我觉得Guid的生成算法是确定的，在条件充足的情况下也是能够预測的，这样生成的随机数也有可预測的可能性。当然仅仅是我的推測，没经过理论的证明。
3. 採用"真随机数发生器"，快看下一节分解！

## （转）随机数是骗人的，.Net、Java、C为我作证

(转载自: http://www.cnblogs.com/rupeng/p/3723018.html ) 几乎所有编程语言中都提供了"生成一个随机数"的方法,也就是调用这个方法会生成一个数,我们事先也不知道它生成什么数.比如在.Net中编写下面的代码: Random rand = newRandom(); Console.WriteLine(rand.Next()); 运行后结果如下: Next()方法用来返回一个随机数.同样的代码你执行和我的结果很可能不一样,而且我多次运行的结果也很

## java设置随机数教程

java作为程序猿开发人员都在使用的一款编程语言,许多入门的朋友都陷入了一个简单的问题就是,使用java开发时随机数要怎么设置?java怎么设置随机数?经常会有地方需要用到随机数,不用着急,一起来看看java设置随机数详细教程吧. ava怎么设置随机数? 一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在j2me中没有. 二.在java.util这