在MatLab和JAVA中生成完全相同的随机数?

时间:2017-05-04 10:28:58

标签: java matlab

我有以下MatLab代码:

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/的结果非常不同。问题不仅在于精度上的一些差异。

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

2 个答案:

答案 0 :(得分:3)

来自rng的文档页面:

  

...

     另外

rng(seed, generator)rng('shuffle', generator)   指定rand,randi使用的随机数生成器的类型,   和兰。生成器输入是以下之一:

     
      
  1. 'twister':Mersenne Twister

  2.   
  3. 'simdTwister':面向SIMD的快速Mersenne Twister

  4.   
  5. 'combRecursive':组合多个递归

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

  8.   
  9. 'v5uniform':LegacyMATLAB®5.0统一生成器

  10.   
  11. 'v5normal':Legacy MATLAB 5.0普通发生器

  12.   
  13. 'v4':Legacy MATLAB 4.0生成器

  14.         

    ...

         

    rng('default')使用随机数生成器的设置   randrandirandn的默认值。这样,一样   生成随机数就像重新启动MATLAB一样。默认   设置是带有种子0的Mersenne Twister。

因此,在MATLAB中,您可以选择随机数生成中使用的算法。假设您使用的是最新版本的MATLAB,那么您目前将Mersenne-Twister与种子1一起使用。

注意:Octave的行为不一定与MATLAB相同。

我不了解Java的一面,所以你应该查看你正在使用的包中使用的算法。

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

答案 1 :(得分:1)

试图从两个随机数生成器中获取相同的数字会使其失败。您不可能获得相同的结果。