我有以下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/的结果非常不同。问题不仅在于精度上的一些差异。
有人可以解释我如何得到相同的结果吗?
答案 0 :(得分:3)
来自rng
的文档页面:
...
另外
rng(seed, generator)
和rng('shuffle', generator)
指定rand,randi使用的随机数生成器的类型, 和兰。生成器输入是以下之一:
'twister':Mersenne Twister
'simdTwister':面向SIMD的快速Mersenne Twister
'combRecursive':组合多个递归
'multFibonacci':乘法滞后斐波那契
'v5uniform':LegacyMATLAB®5.0统一生成器
'v5normal':Legacy MATLAB 5.0普通发生器
- 醇>
'v4':Legacy MATLAB 4.0生成器
...
rng('default')
使用随机数生成器的设置rand
,randi
和randn
的默认值。这样,一样 生成随机数就像重新启动MATLAB一样。默认 设置是带有种子0的Mersenne Twister。
因此,在MATLAB中,您可以选择随机数生成中使用的算法。假设您使用的是最新版本的MATLAB,那么您目前将Mersenne-Twister与种子1一起使用。
注意:Octave的行为不一定与MATLAB相同。
我不了解Java的一面,所以你应该查看你正在使用的包中使用的算法。
在MATLAB命令行输入doc rng
以查看我引用的文档页面。
答案 1 :(得分:1)
试图从两个随机数生成器中获取相同的数字会使其失败。您不可能获得相同的结果。