2017-05-04 56 views
0

我有以下Matlab代码:在MatLab和JAVA中生成完全相同的随机数字?

randn('seed', 1); 
rand('seed', 1); 
A = 0.1*randn(5, 10) 

我想写产生正是相同的结果Java代码。

这里是我的Java代码:

import java.util.Random; 
import java.lang.Math; 

public class HelloWorld 
{ 
    static double[][] random_normal_matrix(Random r, int x, int y) 
    { 
     double tmp[][] = new double[x][y]; 

     for(int i = 0; i < x; i++) 
      for(int j = 0; j < y; j++) 
       tmp[i][j] = 0.1*r.nextGaussian(); 

     return tmp; 
    } 

    public static void main(String[] args) 
    { 
     Random r = new Random(); 
     r.setSeed(1); 
     double tmp[][] = random_normal_matrix(r, 5, 10); 

     for(int i = 0; i < 5; i++) 
     { 
      for(int j = 0; j < 10; j++) 
       System.out.print(tmp[i][j]+" "); 

      System.out.println(); 
     } 
    } 
} 

正如你可以看到,如果你运行的代码,这里https://octave-online.net/这里https://www.compilejava.net/的结果有很大的不同。这个问题不仅仅是精度上的差异。

有人可以请解释我如何能得到相同的结果吗?

+0

你想让两个随机数发生器给你相同的行为? –

+0

“随机数字的产生是通过随机数发生器(RNG)产生的数字或符号序列,不​​能合理地预测好于随机机会。” – e4c5

+1

我正在使用相同的种子值。由于输出是确定性的,应该有可能用相同的种子值得到相同的结果。 –

回答

2

rng的文档页面:

...

rng(seed, generator)rng('shuffle', generator)另外 指定由兰特,兰迪, 和randn使用的随机数生成器的类型。发电机的输入是以下之一:

  1. '捻线':梅森倍捻机

  2. 'simdTwister':SIMD为本快速Mersenne扭曲

  3. 'combRecursive':组合多个递归

  4. 'multFibonacci':乘法滞后斐波那契

  5. 'v5uniform':Lega CYMATLAB®5.0均匀发电机

  6. 'v5normal':传统MATLAB 5.0正常发电机

  7. 'V4':传统MATLAB 4.0发电机

...

rng('default')放使用 的rand,randirandn的随机数生成器的设置为其默认值。通过这种方式,就像重新启动MATLAB一样生成相同的 随机数字。默认 设置是种子0.梅尔松倍捻器。

因此,在MATLAB中,您可以选择用于随机数生成的算法。您目前使用Mersenne-Twister种子1,假设您使用了相当新的MATLAB版本。

小心:Octave不一定与MATLAB相同。

我不知道事情的Java方面,所以你应该查找你使用的包中使用的算法。

在MATLAB命令行输入doc rng查看我引用的文档页面。

1

试图从两个随机数生成器中获得相同的数字会破坏其目的。这是非常不可能的,你会得到相同的结果。

+1

但我使用相同的种子值。具有相同种子值的相同RNG应始终产生相同的结果。 –