2015-04-20 57 views
-4

我正在Java中實現一個測試數據生成器,用於爲Java基本類型生成隨機值。 可能的參數值範圍不受限制。例如,如果我想生成一個隨機整數或浮點數,我會考慮所有可能的值(MAX_INT-MIN_INT)。要做到這一點,我使用的東西,如:。爲什麼java中的隨機函數總是生成高值?

  • 隨機()nextInt()
  • 隨機()nextLong()
  • 隨機()nextFloat()* Float.MAX_VALUE
  • 隨機的()。nextDouble()* Double.MAX_VALUE
  • 等等...

但是,做這樣的,我注意到,所產生的值總是高(接近最大值和價值低參數類型)。例如,經過100000次迭代後,隨機算子不會在[-1000 - 1000]範圍內生成一個值。對於花車,多頭也是一樣。等等,...

你能不能給我的隨機操作人員如何在Java執行的解釋?爲什麼當我們考慮Java類型的所有可能值時,生成的值總是很高?

在此先感謝。

+0

嘗試總結大量的生成值。由於它的分佈是均勻的,所以總和將趨向於0. –

+1

概率是215萬之一,所以我建議你用1000萬的平局重試,你應該會看到一些數字出現...... – assylias

+0

有很多大數字,並不是很多小數字,所以當然你會比小數字大得多。 (你確實要求統一分配...) – immibis

回答

11

「高」和「低」的說法是錯誤的。

單個值(假設均勻分佈)在[-1000,1000]中的概率爲2001/(MAX_INT-MIN_INT),大約爲0.00000046。

這個概率是非常小的,因而也是「小」變量的預期數目會很小。

事實上,在均勻分佈[MIN_INT,MAX_INT],大約一半的元件將是正 - 和負半。
同樣,只有其中的四分之一將是0之間MAX_INT/2(比1000要高得多,你知道的)。

如果您需要更多「低」值,請將自己縮小到更小範圍的元素,或使用非均勻分佈,預計會生成更接近0的值(例如,gaussian)。交談時

 int count1 = 0, count2=0; 
     for (int i = 0; i < 10000; i++) { 
      float x = genFloat(null); 
      if (x < 1E38 && x > 0) count1++; 
      if (x > Float.MAX_VALUE - 1E38) count2++; 
     } 
     System.out.println(count1); 
     System.out.println(count2); 

它產生10000個隨機浮動,並檢查多少是[0,1E38],又有多少是[MAX-1E38,MAX]

需要注意的是:


看一看這段代碼snippest關於浮點數,每個的理論概率是〜1 /(2 * MAX)〜= 14.7%。

正如你所看到的,「接近0」和「接近MAX」在同一範圍內具有在其範圍內產生的變量類似經驗的數量。

+1

@staticx定義「接近MIN或MAX的極限 - 它們之間的接近程度?它們之間的MAX-1000到MAX? – amit

+0

我的意思是接近Float的最大值和最小值(對於長類型而言是相同的) – staticx

+0

@staticx'int count1 = 0,COUNT2 = 0; \t \t的for(int i = 0; I <10000;我++){ \t \t \t浮子X = genFloat(NULL); \t \t \t如果(X < 1000 && x > 0)COUNT1 ++; \t (x> Float.MAX_VALUE - 1000)count2 ++; \t \t} \t \t System.out.println(count1); \t \t System.out.println(count2);'結果都是0對我。你的看法是錯誤的。你認爲MAX-100000是「接近MAX」,但100000不小,均勻分佈,同樣的機會在[0,100000]和[MAX-100000,MAX] – amit