JAVA 随机数的理解

论坛引用:
1.我只要知道伪随机数用的是哪种算法,
就能准确的知道下一个数将是什么 PS:一个相面的如是说.
2.只有量子计算机才能产生真随机数
3.用时间做种子是不错的方法,time+CPUID+MAC

引用:http://gatusso52.iteye.com/blog/400090

1 两种方法 java.lang.Math.random()  与 java.util.Random

2 java.util.Random的两种构造发发

无参: 返回可正可负

long:种子

 

java.lang.Math.random()

返回0到1间

 

3 返回a到b间的随机数

 java.lang.Math.random() × (b-a+1) + a

new ava.util.Random() .nextInt(b-a) +a

 

4  java.util.Random 线程安全

 

5 java.util.Random如果同样的种子,则返回同样的随机数

java.util.Random rand1 = new java.util.Random(50);

java.util.Random rand2 = new java.util.Random(50);

int i1 = rand1.nextInt();

int i2 = rand2.nextInt();

则i1 == i2


引用:http://dev.csdn.net/article/62/62843.shtm
綠起:
想在J2ME中产生一个随机的潜艇出现的位置,其实也只需要一个Y坐标而已。用了nextInt方法,代码类似如下:,
奇怪的是要得到两个随机的数,得到的却是两个相同的数而已:当场

class T{
  int x;
  java.util.Random r=new java.util.Random();
  T() {
    x=(r.nextInt() >>> 1) %10; //产生一个0-9之间一个数、、、
  }
  int getT() {
    return this.x;//得到这个随机数
  }
}
public class TR {
  public static void main(String[] args) {  
    for(int i=0;i<2;i++) {     
      T t=new T();
      System.out.println(t.getT());//输出这个随机数,但结果很大程度上是一样的、、
    }   
  }
}

于是找到一些关于随机数的资料:
得到结论如下:
1。导致随机数一样的原因为:因为随机数用的是当前时间做随机种子,就是new Random(时间为种子的),所以程序出现的太快会出现一样的原因。

解决办法:
在产生随机数的时候让他隔个一段时间,如:
try {Thread.sleep(100);} catch(Exception e) {}
产生的就没有问题了。

关于随机数:
产生随机数的方法:
1。用Random()之后调用nextInt()来产生随机数,至于想要产生自己想要的范围就要做一下手脚 了,取正取模就可以了
    如:(rand.nextInt()>>>1 ) % 101
2。其实用nextInt()这个方法已经很老套了,而且如果一般用作产生一定范围的随机数的话(用上面的方法,取正取模),就会出现数值偏小的情况,所以JDK升级的版本的用法就为nextInt(100)产生0-100之间的随机数:
3。其实还有一个方法就是Math.random()来产生一个0-1之间的浮点数:之后你就可以*你要的范围了,取整就可以,这个方法可以有效的避免上面重复的问题,
4。手机上的用法:可惜的是J2ME只提供nextInt()不提供nextInt(范围)(MIDP2.0也不支持),更不支持Math.random我想主要是用到了浮点运算吧,我想手机还是用不了,(不知道为什么用nextInt(范围)WTK可以运行,(JbuilderX提示有这个方法?但是API里面又没有,同时如果用S60做DEVICE的话,这个地方会报错,其他的DEVICE不会报错,)但是在爱鸡6600上,通不过,呵呵,还好早发现这个问题,鸡6上又不报错,寒~~~)

总结:
一般最好用nextInt(范围)的,如果不是大量的运算的话,就可以用Math.random了,(因为他可以运算起来慢一些,浮点之后再取整),像我没有办法只好用第一个方法了

你可能感兴趣的:(java,jdk,thread,.net,算法)