簡體   English   中英

如何生成隨機實數列表

[英]How to generate a list of random real numbers

如何生成特定范圍之間的隨機實數列表,例如。 -50 到 50? 我寫的函數只返回一個雙精度列表。 我希望它返回的是這樣的:35、-3、1.6、4.5、-22.8、10、-12、5.2、3.6、-8。 這是我迄今為止嘗試過的......任何幫助表示贊賞!

public static double [] randomArray(int A)
{
    double [] randomArr = new double[A];
    Random r = new Random();
    for(int i = 0; i < A; i++)
        {
            randomArr[i] = (r.nextDouble() *(100)) - 50;
        }
    return randomArr;
}

在隨機生成整數或小數之間隨機切換

您似乎在要求整數(整數, intInteger )和小數( floatdoubleFloatDouble )的隨機混合。 我想你明白,一個隨機Float / Double 可能變成是為零的小數部分的整數,但要大幅增加整數的存在。

可能有更聰明的方法,但是我將使用隨機數來選擇在生成下一個整數還是小數之間進行選擇。

作為隨機數生成器,我建議使用ThreadLocalRandom因為它在設計上是線程安全的。

如果要限制可能值的范圍,請指定可選的origin和bound 我無法想象為什么,但是在生成浮點數時似乎沒有指定源/綁定的選項,因此必須使用雙精度。

如果要將小數位數截斷為特定位數,請參閱如何在Java中將雙精度數截斷至僅兩位小數?

示例代碼。

int initialCapacity = 10;
List < Number > numbers = new ArrayList <>( initialCapacity );

for ( int i = 1 ; i <= initialCapacity ; i++ )
{
    int which = ThreadLocalRandom.current().nextInt( 2 ); // Produce either 0 or 1. The bound is exclusive, so we specify `2`.
    switch ( which )
    {
        case 0:
            numbers.add( ThreadLocalRandom.current().nextInt( - 50 , 50 ) );
            break;
        case 1:
            numbers.add( ThreadLocalRandom.current().nextDouble( - 50 , 50 ) );
            break;
        default:
            throw new IllegalStateException( "The `which` switch should be only zero or one. Message # 108d8e3f-bce7-4f0f-8dff-652940a17ba1." );
    }
}

運行時:

numbers.toString():[28.344775355282835,-36.00411659190424,4.151429648004303,-26.898964417043725,31,4,17.172537217625035,4,29.957510122739222,-46]

我的代碼假定您需要大約一半和一半的整數和小數。 如果要使用其他比率,請嘗試使用該比率的范圍which然后將switch更改為級聯if語句,以測試數字范圍。 例如,如果您想要20%的整數,則生成1-10,結果1&2產生一個Integer而3-10產生一個Float 再次,在數學上可能有更聰明的方法,但是這種方法可以完成工作。

BigDecimal

float / doubleFloat / Double類型使用浮點技術。 浮點數會犧牲精度來提高執行速度。 因此,例如,某些數字不能精確表示到小數點后兩位。

如果您更關心准確性而不是速度(例如處理金錢時),請在我的代碼使用Double地方替換BigDecimal

自動裝箱

我上面的代碼生成一個double原始值,而List存儲對象。 Java在存儲在數組中之前會自動將原語包裝為Double對象。 如果您不熟悉此技巧,請了解有關自動裝箱的信息 請參見Oracle教程

您可以使用DecimalFormat。

片段:

import java.util.Random;
import java.text.*;
class Main {
  public static void main(String[] args) {
    System.out.println("Number Format Sample!");
    int n = 5;
    double [] randomArr = randomArray(n);
    DecimalFormat format = new DecimalFormat("0.#");

      for(int i = 0; i < n; i++)
      {
            System.out.println("randomArr item : "+format.format(randomArr[i]));
      }
  }
  public static double [] randomArray(int A)
  {
    double [] randomArr = new double[A];
    Random r = new Random();
    for(int i = 0; i < A; i++)
        {
            randomArr[i] =(r.nextDouble() *(100)) - 50;
        }
    return randomArr;
}
}

輸出:

Number Format Sample!
randomArr item : -30.8
randomArr item : -36.9
randomArr item : 44.2
randomArr item : 13.6
randomArr item : -49.1

參考: https : //docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

從Java 8+開始,使用隨機數流。

      Random r = new Random();
      double[] nums =
            r.doubles(20, -50., 50.).map(a -> (int) (a * 10) / 10.).toArray();
      System.out.println(Arrays.toString(nums));

生成介於-50.0..50.0(含)之間的值,精度為小數點后一位(例如42.5 )。 注意:並非所有十進制值都可以完美地包含為浮點值。

for (int i = 0; i < A; i++)
{
    double value = (r.nextInt(501) / 10.0) * (r.nextBoolean() ? 1 : -1);
    randomArr[i] = value;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM