2017-05-04 126 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應始終產生相同的結果。 –