java.lang.Math.Random()与java.util.Random生成随机数的区别

一个是方法一个是对象之类的废话就不说了。关键在与两个生成随机数的不同特征。
因为在做图像特征提取,对整个像素空间的逐个提取、识别显然不太聪明,于是乎想起概率论上的一堆东东。
取得一个可以反应整个向量空间的随机数集合,不失为明智的选择。

《Think in Java》里面经常用那个对象弄,自然我首先想到了这个。同学则喜欢Math.Random,他认为生成的是一个在区间均匀分布的符合要求的随机数。以前从来没想过“随机”这个问题,到底是一个任意的数(各个概率一样,就像古典概型里面,硬币的正反一样),还是一个在空间有均匀分布特征的呢?

在网上搜罗了一大堆东西,发现说什么的都有,越来越迷糊。最后想起该看看权威的JDK API说明乎:

random(注:java.lang.Math)
public static double random()
返回带正号的 
double 值,该值大于等于 0.0 且小于 1.0。返回值是一个伪随机选择的数,在该范围内(近似)均匀分布。 
第一次调用该方法时,它将创建一个新的伪随机数生成器,与以下表达式完全相同 

new java.util.Random
之后,新的伪随机数生成器可用于此方法的所有调用,但不能用于其他地方。 
此方法是完全同步的,可允许多个线程使用而不出现错误。但是,如果许多线程需要以极高的速率生成伪随机数,那么这可能会减少每个线程对拥有自己伪随机数生成器的争用。 


返回: 
大于等于 
0.0 且小于 1.0 的伪随机 double 值。 

下面是java.util里面的

java.util 
类 Random
java.lang.Object
  java.util.Random
所有已实现的接口: 
Serializable 
直接已知子类: 
SecureRandom 

--------------------------------------------------------------------------------

public class Randomextends Objectimplements Serializable此类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改(请参阅 Donald Knuth 的The Art of Computer Programming, Volume 3,第 3.2.1 节)。 

如果用相同的种子创建两个 Random 实例,则对每个实例进行相同的方法调用序列,它们将生成并返回相同的数字序列。为了保证此属性的实现,为类 Random 指定了特定的算法。为了 Java 代码的完全可移植性,Java 实现必须让类 Random 使用此处所示的所有算法。但是允许 Random 类的子类使用其他算法,只要其符合所有方法的常规协定即可。 

Random 类实现的算法使用一个 
protected 实用工具方法,每次调用它最多可提供 32 个伪随机生成的位。 

很多应用程序会发现 Math.random() 方法更易于使用。 


看看下面的就更加显而易见啦
next
protected int next(int bits)生成下一个伪随机数。当被所有其他方法使用时,子类应该重写此方法。 
next 的常规协定是,返回一个 
int 值,如果参数 bits 位处于 1 和 32(包括)之间,那么返回值的多数低位都将(大致)是单独选择的位值,每个位值是 0 或 1 的机会(大致)相等。通过将种子自动更新为 

(seed 
* 0x5DEECE66DL + 0xBL& ((1L << 48- 1)并返回 
(
int)(seed >>> (48 - bits)),Random 类可实现 next 方法。这是一个线性同余伪随机数生成器,由 D. H. Lehmer 定义,Donald E. Knuth 在 The Art of Computer Programming, Volume 3: Seminumerical Algorithms 的第 3.2.1 节中进行了描述。 

参数:
bits 
- 随机位。 
返回:
随机数生成器序列的下一个伪随机值。

于是我的结论如下:
1:java.lang.Math.Random()这个静态方法得到的是一个空间中有均匀分布特征的随机数。
2:java.util.Random,通过这个对象得到的则是“几何分布”
3:我的图像特征应该选择第一个方法比较适当。

问题:我的似乎应该说是一个抽样问题更为恰当。呼呼,先写到这里


啦啦啦,请高人指教。

posted on 2008-05-01 17:15 Jarod.cn.LuLuLife 阅读(26707) 评论(3)  编辑  收藏

评论

# re: java.lang.Math.Random()与java.util.Random生成随机数的区别[未登录] 2008-05-30 23:37 ZZ

请问你能不能用C编写一个生成正态分布随机数的程序,而且是用中心极限定理和Box-Muller变换两种方法产生的???
  回复  更多评论   

# re: java.lang.Math.Random()与java.util.Random生成随机数的区别 2008-05-31 01:07 Jarod.cn.LuLuLife


1 : double _sta( double mu, double sigma) // 利用中心极限定理生成
2 {
3 int i;
4 double r,sum = 0.0 ;
5
6 if (sigma <= 0.0 ) { printf( " Sigma<=0.0 in _sta! " ); exit( 1 ); }
7 for (i = 1 ;i <= 12 ;i ++ )
8 sum = sum + _random();
9 r = (sum - 6.00 ) * sigma + mu;
10
11 return r;
12
13 }

(网上很多吧,自己验证哈,我也是搜来的。)  回复  更多评论   

# re: java.lang.Math.Random()与java.util.Random生成随机数的区别 2009-03-25 15:38 P.W

赞一下钻研的精神~  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2008年5月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

导航

统计

公告

我的知识Blog!

常用链接

留言簿(3)

随笔档案

文章档案

Image

搜索

最新评论

阅读排行榜

评论排行榜