鴻蒙OS Random

2022-08-03 11:26 更新

Random

java.lang.Object

|---java.util.Random

public class Random
extends Object
implements Serializable

此類(lèi)的一個(gè)實(shí)例用于生成偽隨機(jī)數(shù)流。 該類(lèi)使用 48 位種子,該種子使用線(xiàn)性同余公式進(jìn)行修改。

如果使用相同的種子創(chuàng)建 Random 的兩個(gè)實(shí)例,并且為每個(gè)實(shí)例進(jìn)行相同的方法調(diào)用序列,它們將生成并返回相同的數(shù)字序列。 為了保證這一特性,為類(lèi) Random 指定了特定的算法。 為了 Java 代碼的絕對(duì)可移植性,Java 實(shí)現(xiàn)必須使用此處為類(lèi) Random 顯示的所有算法。 但是,允許類(lèi) Random 的子類(lèi)使用其他算法,只要它們遵守所有方法的通用合同。

類(lèi) Random 實(shí)現(xiàn)的算法使用受保護(hù)的實(shí)用程序方法,該方法在每次調(diào)用時(shí)可以提供多達(dá) 32 個(gè)偽隨機(jī)生成的位。

許多應(yīng)用程序會(huì)發(fā)現(xiàn) Math#random 方法更易于使用。

java.util.Random 的實(shí)例是線(xiàn)程安全的。 但是,跨線(xiàn)程并發(fā)使用同一個(gè) java.util.Random 實(shí)例可能會(huì)遇到爭(zhēng)用,從而導(dǎo)致性能下降。 考慮改為在多線(xiàn)程設(shè)計(jì)中使用 ThreadLocalRandom。

java.util.Random 的實(shí)例在密碼學(xué)上不是安全的。 考慮改為使用 SecureRandom 來(lái)獲取加密安全的偽隨機(jī)數(shù)生成器,以供安全敏感的應(yīng)用程序使用。

構(gòu)造函數(shù)摘要

構(gòu)造函數(shù) 描述
Random() 創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。
Random(long seed) 使用單個(gè)長(zhǎng)種子創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。

方法總結(jié)

修飾符和類(lèi)型 方法 描述
DoubleStream doubles() 返回一個(gè)有效無(wú)限的偽隨機(jī)雙精度值流,每個(gè)值介于零(包括)和一(不包括)之間。
DoubleStream doubles(double randomNumberOrigin, double randomNumberBound) 返回一個(gè)有效無(wú)限的偽隨機(jī)雙精度值流,每個(gè)都符合給定的原點(diǎn)(包括)和綁定(不包括)。
DoubleStream doubles(long streamSize) 返回一個(gè)流,該流產(chǎn)生給定的 streamSize 數(shù)量的偽隨機(jī)雙精度值,每個(gè)值介于零(包括)和一(不包括)之間。
DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound) 返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī)雙精度值的流,每個(gè)都符合給定的原點(diǎn)(包括)和綁定(不包括)。
IntStream ints() 返回一個(gè)有效無(wú)限的偽隨機(jī) int 值流。
IntStream ints(int randomNumberOrigin, int randomNumberBound) 返回一個(gè)有效無(wú)限的偽隨機(jī) int 值流,每個(gè)值都符合給定的原點(diǎn)(包括)和綁定(不包括)。
IntStream ints(long streamSize) 返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) int 值的流。
IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound) 返回一個(gè)流,該流產(chǎn)生給定的 streamSize 數(shù)量的偽隨機(jī) int 值,每個(gè)都符合給定的原點(diǎn)(包括)和邊界(不包括)。
LongStream longs() 返回一個(gè)有效無(wú)限的偽隨機(jī)長(zhǎng)值流。
LongStream longs(long streamSize) 返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) long 值的流。
LongStream longs(long randomNumberOrigin, long randomNumberBound) 返回一個(gè)有效無(wú)限的偽隨機(jī)長(zhǎng)值流,每個(gè)值都符合給定的原點(diǎn)(包括)和綁定(不包括)。
LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound) 返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) long 的流,每個(gè)都符合給定的原點(diǎn)(包括)和綁定(不包括)。
protected int next(int bits) 生成下一個(gè)偽隨機(jī)數(shù)。
boolean nextBoolean() 從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的布爾值。
void nextBytes(byte[] bytes) 生成隨機(jī)字節(jié)并將它們放入用戶(hù)提供的字節(jié)數(shù)組中。
double nextDouble() 從該隨機(jī)數(shù)生成器的序列中返回 0.0 到 1.0 之間的下一個(gè)偽隨機(jī)、均勻分布的雙精度值。
float nextFloat() 從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的浮點(diǎn)值,介于 0.0 和 1.0 之間。
double nextGaussian() 從該隨機(jī)數(shù)生成器的序列返回下一個(gè)偽隨機(jī)、高斯(“正?!保┓植茧p精度值,均值為 0.0,標(biāo)準(zhǔn)差為 1.0。
int nextInt() 從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的 int 值。
int nextInt(int bound) 返回一個(gè)偽隨機(jī)、均勻分布的 int 值,介于 0(包括)和指定值(不包括)之間,取自該隨機(jī)數(shù)生成器的序列。
long nextLong() 從這個(gè)隨機(jī)數(shù)生成器序列返回下一個(gè)偽隨機(jī)、均勻分布的長(zhǎng)值。
void setSeed(long seed) 使用單個(gè)長(zhǎng)種子設(shè)置此隨機(jī)數(shù)生成器的種子。
從類(lèi) java.lang.Object 繼承的方法
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait

構(gòu)造函數(shù)詳細(xì)信息

Random

public Random()

創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。 此構(gòu)造函數(shù)將隨機(jī)數(shù)生成器的種子設(shè)置為一個(gè)很可能與此構(gòu)造函數(shù)的任何其他調(diào)用不同的值。

Random

public Random(long seed)

使用單個(gè)長(zhǎng)種子創(chuàng)建一個(gè)新的隨機(jī)數(shù)生成器。 種子是偽隨機(jī)數(shù)生成器內(nèi)部狀態(tài)的初始值,由方法 next(int) 維護(hù)。

調(diào)用 new Random(seed) 等效于:

 Random rnd = new Random();
 rnd.setSeed(seed);

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
seed 初始種子

方法詳情

setSeed

public void setSeed(long seed)

使用單個(gè)長(zhǎng)種子設(shè)置此隨機(jī)數(shù)生成器的種子。 setSeed 的一般約定是,它會(huì)更改此隨機(jī)數(shù)生成器對(duì)象的狀態(tài),使其處于與剛剛使用參數(shù)種子作為種子創(chuàng)建時(shí)完全相同的狀態(tài)。 方法 setSeed 由 Random 類(lèi)通過(guò)原子更新種子來(lái)實(shí)現(xiàn)

(seed ^ 0x5DEECE66DL) & ((1L << 48) - 1)

并清除 nextGaussian() 使用的 haveNextNextGaussian 標(biāo)志。

由 Random 類(lèi)實(shí)現(xiàn)的 setSeed 恰好只使用給定種子的 48 位。 然而,一般來(lái)說(shuō),覆蓋方法可以使用長(zhǎng)參數(shù)的所有 64 位作為種子值。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
seed 初始種子

next

protected int next(int bits)

生成下一個(gè)偽隨機(jī)數(shù)。 子類(lèi)應(yīng)該覆蓋它,因?yàn)樗凰衅渌椒ㄊ褂谩?/p>

next 的一般約定是它返回一個(gè) int 值,如果參數(shù)位在 1 到 32(含)之間,那么返回值的許多低位將(大約)獨(dú)立選擇的位值,其中每個(gè) 是(大約)同樣可能是 0 或 1。方法 next 由 Random 類(lèi)通過(guò)原子更新種子來(lái)實(shí)現(xiàn)

(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)

并返回

(int)(seed >>> (48 - bits)).

這是一個(gè)線(xiàn)性同余偽隨機(jī)數(shù)生成器,由 D. H. Lehmer 定義并由 Donald E. Knuth 在計(jì)算機(jī)編程藝術(shù),第 3 卷:半數(shù)值算法,第 3.2.1 節(jié)中描述。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
bits 隨機(jī)位

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)值

nextBytes

public void nextBytes(byte[] bytes)

生成隨機(jī)字節(jié)并將它們放入用戶(hù)提供的字節(jié)數(shù)組中。 產(chǎn)生的隨機(jī)字節(jié)數(shù)等于字節(jié)數(shù)組的長(zhǎng)度。

nextBytes 方法由 Random 類(lèi)實(shí)現(xiàn),就像這樣:

  public void nextBytes(byte[] bytes) {
   for (int i = 0; i < bytes.length; )
     for (int rnd = nextInt(), n = Math.min(bytes.length - i, 4);
          n-- > 0; rnd >>= 8)
       bytes[i++] = (byte)rnd;
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
bytes 要填充隨機(jī)字節(jié)的字節(jié)數(shù)組

Throws:

Throw名稱(chēng) Throw描述
NullPointerException 如果字節(jié)數(shù)組為空

nextInt

public int nextInt()

從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的 int 值。 nextInt 的一般約定是偽隨機(jī)生成并返回一個(gè) int 值。 所有 232 個(gè)可能的 int 值都是以(大約)相等的概率產(chǎn)生的。

nextInt 方法由 Random 類(lèi)實(shí)現(xiàn),就像通過(guò):

  public int nextInt() {
   return next(32);
 }

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)、均勻分布的 int 值

nextInt

public int nextInt(int bound)

返回一個(gè)偽隨機(jī)、均勻分布的 int 值,介于 0(包括)和指定值(不包括)之間,取自該隨機(jī)數(shù)生成器的序列。 nextInt 的一般約定是偽隨機(jī)生成并返回指定范圍內(nèi)的一個(gè) int 值。 所有綁定的可能 int 值都以(大約)相等的概率產(chǎn)生。 nextInt(int bound) 方法由 Random 類(lèi)實(shí)現(xiàn),就像通過(guò):

  public int nextInt(int bound) {
   if (bound <= 0)
     throw new IllegalArgumentException("bound must be positive");


   if ((bound & -bound) == bound)  // i.e., bound is a power of 2
     return (int)((bound * (long)next(31)) >> 31);


   int bits, val;
   do {
       bits = next(31);
       val = bits % bound;
   } while (bits - val + (bound-1) < 0);
   return val;
 }

在前面的描述中使用對(duì)沖“大約”只是因?yàn)橄乱粋€(gè)方法只是大約獨(dú)立選擇位的無(wú)偏源。 如果它是隨機(jī)選擇的位的完美來(lái)源,那么所示的算法將從規(guī)定的范圍內(nèi)以完美的一致性選擇 int 值。

該算法有點(diǎn)棘手。 它拒絕會(huì)導(dǎo)致分布不均勻的值(因?yàn)?2^31 不能被 n 整除)。 一個(gè)值被拒絕的概率取決于 n。 最壞的情況是 n=2^30+1,拒絕的概率是 1/2,循環(huán)終止前的預(yù)期迭代次數(shù)是 2。

該算法特別處理 n 是 2 的冪的情況:它從底層偽隨機(jī)數(shù)生成器返回正確數(shù)量的高位。 在沒(méi)有特殊處理的情況下,將返回正確數(shù)量的低位。 已知線(xiàn)性同余偽隨機(jī)數(shù)生成器(例如由此類(lèi)實(shí)現(xiàn)的那個(gè))在其低位的值序列中具有短周期。 因此,如果 n 是 2 的小冪,這種特殊情況會(huì)大大增加連續(xù)調(diào)用此方法返回的值序列的長(zhǎng)度。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
bound 上限(不包括)。 必須是積極的。

返回:

此隨機(jī)數(shù)生成器序列的下一個(gè)偽隨機(jī)、均勻分布的 int 值,介于零(包括)和邊界(不包括)之間

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 bound 不是正數(shù)

nextLong

public long nextLong()

從這個(gè)隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的 long 值。 nextLong 的一般合約是偽隨機(jī)生成并返回一個(gè) long 值。

nextLong 方法由 Random 類(lèi)實(shí)現(xiàn),就像通過(guò):

  public long nextLong() {
   return ((long)next(32) << 32) + next(32);
 }

因?yàn)?Random 類(lèi)使用只有 48 位的種子,所以該算法不會(huì)返回所有可能的 long 值。

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)、均勻分布的長(zhǎng)值

nextBoolean

public boolean nextBoolean()

從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的布爾值。 nextBoolean 的一般約定是偽隨機(jī)生成并返回一個(gè)布爾值。 值 true 和 false 以(大約)相等的概率產(chǎn)生。

nextBoolean 方法由 Random 類(lèi)實(shí)現(xiàn),就像通過(guò):

  public boolean nextBoolean() {
   return next(1) != 0;
 }

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)、均勻分布的布爾值

nextFloat

public float nextFloat()

從該隨機(jī)數(shù)生成器的序列中返回下一個(gè)偽隨機(jī)、均勻分布的浮點(diǎn)值,介于 0.0 和 1.0 之間。

nextFloat 的一般約定是從 0.0f(包括)到 1.0f(不包括)范圍內(nèi)(大約)均勻選擇的一個(gè)浮點(diǎn)值是偽隨機(jī)生成并返回的。 m x 2-24 形式的所有 224 個(gè)可能的浮點(diǎn)值(其中 m 是小于 224 的正整數(shù))以(大約)相等的概率產(chǎn)生。

nextFloat 方法由 Random 類(lèi)實(shí)現(xiàn),就像通過(guò):

  public float nextFloat() {
   return next(24) / ((float)(1 << 24));
 }

在前面的描述中使用對(duì)沖“大約”只是因?yàn)橄乱粋€(gè)方法只是大約獨(dú)立選擇位的無(wú)偏源。 如果它是隨機(jī)選擇的位的完美來(lái)源,那么所示的算法將從規(guī)定的范圍內(nèi)選擇具有完美一致性的浮點(diǎn)值。

[在 Java 的早期版本中,結(jié)果被錯(cuò)誤地計(jì)算為:

    return next(30) / ((float)(1 << 30));

這似乎是等效的,如果不是更好的話(huà),但實(shí)際上由于浮點(diǎn)數(shù)舍入的偏差,它引入了輕微的不均勻性:有效數(shù)字的低位為 0 的可能性略高于 它將是 1。]

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)、均勻分布的浮點(diǎn)值,介于 0.0 和 1.0 之間

nextDouble

public double nextDouble()

從該隨機(jī)數(shù)生成器的序列中返回 0.0 到 1.0 之間的下一個(gè)偽隨機(jī)、均勻分布的雙精度值。

nextDouble 的一般約定是從 0.0d(包括)到 1.0d(不包括)范圍內(nèi)(大約)均勻選擇的一個(gè) double 值是偽隨機(jī)生成并返回的。

nextDouble 方法由 Random 類(lèi)實(shí)現(xiàn),就像這樣:

  public double nextDouble() {
   return (((long)next(26) << 27) + next(27))
     / (double)(1L << 53);
 }

在前面的描述中使用對(duì)沖“大約”只是因?yàn)橄乱粋€(gè)方法只是大約獨(dú)立選擇位的無(wú)偏源。 如果它是隨機(jī)選擇的位的完美來(lái)源,那么所示的算法將從規(guī)定的范圍中選擇具有完美一致性的雙精度值。

[在 Java 的早期版本中,結(jié)果被錯(cuò)誤地計(jì)算為:

    return (((long)next(27) << 27) + next(27))
     / (double)(1L << 54);

這似乎是等效的,如果不是更好的話(huà),但實(shí)際上由于浮點(diǎn)數(shù)舍入的偏差,它引入了很大的不均勻性:有效數(shù)字的低位為 0 的可能性是其三倍 比那將是1! 這種不均勻性在實(shí)踐中可能并不重要,但我們力求完美。]

返回:

此隨機(jī)數(shù)生成器序列中的下一個(gè)偽隨機(jī)、均勻分布的雙精度值,介于 0.0 和 1.0 之間

nextGaussian

public double nextGaussian()

從該隨機(jī)數(shù)生成器的序列返回下一個(gè)偽隨機(jī)、高斯(“正常”)分布雙精度值,均值為 0.0,標(biāo)準(zhǔn)差為 1.0。

nextGaussian 的一般約定是從(大約)平均值為 0.0 和標(biāo)準(zhǔn)差為 1.0 的通常正態(tài)分布中選擇的一個(gè) double 值是偽隨機(jī)生成并返回的。

nextGaussian 方法由 Random 類(lèi)實(shí)現(xiàn),就好像由以下線(xiàn)程安全版本實(shí)現(xiàn):

 private double nextNextGaussian;
 private boolean haveNextNextGaussian = false;


 public double nextGaussian() {
   if (haveNextNextGaussian) {
     haveNextNextGaussian = false;
     return nextNextGaussian;
   } else {
     double v1, v2, s;
     do {
       v1 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
       v2 = 2 * nextDouble() - 1;   // between -1.0 and 1.0
       s = v1 * v1 + v2 * v2;
     } while (s >= 1 || s == 0);
     double multiplier = StrictMath.sqrt(-2 * StrictMath.log(s)/s);
     nextNextGaussian = v2 * multiplier;
     haveNextNextGaussian = true;
     return v1 * multiplier;
   }
 }

這使用 G. E. P. Box、M. E. Muller 和 G. Marsaglia 的極坐標(biāo)方法,如 Donald E. Knuth 在計(jì)算機(jī)編程藝術(shù)第 3 卷:半數(shù)值算法,第 3.4.1 節(jié),C 小節(jié),算法 P 中所述。請(qǐng)注意, 它僅以一次調(diào)用 StrictMath.log 和一次調(diào)用 StrictMath.sqrt 為代價(jià)生成兩個(gè)獨(dú)立的值。

返回:

下一個(gè)偽隨機(jī),高斯(“正?!保┓植嫉碾p精度值,均值為 0.0,標(biāo)準(zhǔn)差為 1.0,來(lái)自該隨機(jī)數(shù)生成器的序列

ints

public IntStream ints(long streamSize)

返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) int 值的流。

生成一個(gè)偽隨機(jī) int 值,就好像它是調(diào)用方法 nextInt() 的結(jié)果一樣。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量

返回:

偽隨機(jī) int 值流

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零

ints

public IntStream ints()

返回一個(gè)有效無(wú)限的偽隨機(jī) int 值流。

生成一個(gè)偽隨機(jī) int 值,就好像它是調(diào)用方法 nextInt() 的結(jié)果一樣。

返回:

偽隨機(jī) int 值流

ints

public IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)

返回一個(gè)流,該流產(chǎn)生給定的 streamSize 數(shù)量的偽隨機(jī) int 值,每個(gè)都符合給定的原點(diǎn)(包括)和邊界(不包括)。

生成一個(gè)偽隨機(jī) int 值,就好像它是使用原點(diǎn)和綁定調(diào)用以下方法的結(jié)果:

  int nextInt(int origin, int bound) {
   int n = bound - origin;
   if (n > 0) {
     return nextInt(n) + origin;
   }
   else {  // range not representable as int
     int r;
     do {
       r = nextInt();
     } while (r < origin || r >= bound);
     return r;
   }
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) int 值流,每個(gè)值都具有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零,或者 randomNumberOrigin 大于或等于 randomNumberBound

ints

public IntStream ints(int randomNumberOrigin, int randomNumberBound)

返回一個(gè)有效無(wú)限的偽隨機(jī) int 值流,每個(gè)值都符合給定的原點(diǎn)(包括)和綁定(不包括)。

生成一個(gè)偽隨機(jī) int 值,就好像它是使用原點(diǎn)和綁定調(diào)用以下方法的結(jié)果:

  int nextInt(int origin, int bound) {
   int n = bound - origin;
   if (n > 0) {
     return nextInt(n) + origin;
   }
   else {  // range not representable as int
     int r;
     do {
       r = nextInt();
     } while (r < origin || r >= bound);
     return r;
   }
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) int 值流,每個(gè)值都具有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 randomNumberOrigin 大于或等于 randomNumberBound

longs

public LongStream longs(long streamSize)

返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) long 值的流。

生成一個(gè)偽隨機(jī)長(zhǎng)值,就好像它是調(diào)用方法 nextLong() 的結(jié)果。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量

返回:

偽隨機(jī) long 值流

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零

longs

public LongStream longs()

返回一個(gè)有效無(wú)限的偽隨機(jī)長(zhǎng)值流。

生成一個(gè)偽隨機(jī)長(zhǎng)值,就好像它是調(diào)用方法 nextLong() 的結(jié)果。

返回:

偽隨機(jī) long 值流

longs

public LongStream longs(long streamSize, long randomNumberOrigin, long randomNumberBound)

返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī) long 的流,每個(gè)都符合給定的原點(diǎn)(包括)和綁定(不包括)。

生成一個(gè)偽隨機(jī)長(zhǎng)值,就好像它是使用源和綁定調(diào)用以下方法的結(jié)果:

  long nextLong(long origin, long bound) {
   long r = nextLong();
   long n = bound - origin, m = n - 1;
   if ((n & m) == 0L)  // power of two
     r = (r & m) + origin;
   else if (n > 0L) {  // reject over-represented candidates
     for (long u = r >>> 1;            // ensure nonnegative
          u + m - (r = u % n) < 0L;    // rejection check
          u = nextLong() >>> 1) // retry
         ;
     r += origin;
   }
   else {              // range not representable as long
     while (r < origin || r >= bound)
       r = nextLong();
   }
   return r;
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) long 值流,每個(gè)值都具有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零,或者 randomNumberOrigin 大于或等于 randomNumberBound

longs

public LongStream longs(long randomNumberOrigin, long randomNumberBound)

返回一個(gè)有效無(wú)限的偽隨機(jī)長(zhǎng)值流,每個(gè)值都符合給定的原點(diǎn)(包括)和綁定(不包括)。

生成一個(gè)偽隨機(jī)長(zhǎng)值,就好像它是使用源和綁定調(diào)用以下方法的結(jié)果:

  long nextLong(long origin, long bound) {
   long r = nextLong();
   long n = bound - origin, m = n - 1;
   if ((n & m) == 0L)  // power of two
     r = (r & m) + origin;
   else if (n > 0L) {  // reject over-represented candidates
     for (long u = r >>> 1;            // ensure nonnegative
          u + m - (r = u % n) < 0L;    // rejection check
          u = nextLong() >>> 1) // retry
         ;
     r += origin;
   }
   else {              // range not representable as long
     while (r < origin || r >= bound)
       r = nextLong();
   }
   return r;
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) long 值流,每個(gè)值都具有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 randomNumberOrigin 大于或等于 randomNumberBound

doubles

public DoubleStream doubles(long streamSize)

返回一個(gè)流,該流產(chǎn)生給定的 streamSize 數(shù)量的偽隨機(jī)雙精度值,每個(gè)值介于零(包括)和一(不包括)之間。

生成一個(gè)偽隨機(jī)雙精度值,就好像它是調(diào)用方法 nextDouble() 的結(jié)果。

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量

返回:

double 值流

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零

doubles

public DoubleStream doubles()

返回一個(gè)有效無(wú)限的偽隨機(jī)雙精度值流,每個(gè)值介于零(包括)和一(不包括)之間。

生成一個(gè)偽隨機(jī)雙精度值,就好像它是調(diào)用方法 nextDouble() 的結(jié)果。

返回:

偽隨機(jī) double 值流

doubles

public DoubleStream doubles(long streamSize, double randomNumberOrigin, double randomNumberBound)

返回產(chǎn)生給定 streamSize 數(shù)量的偽隨機(jī)雙精度值的流,每個(gè)都符合給定的原點(diǎn)(包括)和邊界(不包括)。

生成一個(gè)偽隨機(jī)雙精度值,就好像它是使用原點(diǎn)和綁定調(diào)用以下方法的結(jié)果:

  double nextDouble(double origin, double bound) {
   double r = nextDouble();
   r = r * (bound - origin) + origin;
   if (r >= bound) // correct for rounding
     r = Math.nextDown(bound);
   return r;
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
streamSize 要生成的值的數(shù)量
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) double 值流,每個(gè)都有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 streamSize 小于零
IllegalArgumentException 如果 randomNumberOrigin 大于或等于 randomNumberBound

doubles

public DoubleStream doubles(double randomNumberOrigin, double randomNumberBound)

返回一個(gè)有效無(wú)限的偽隨機(jī)雙精度值流,每個(gè)都符合給定的原點(diǎn)(包括)和綁定(不包括)。

生成一個(gè)偽隨機(jī)雙精度值,就好像它是使用原點(diǎn)和綁定調(diào)用以下方法的結(jié)果:

  double nextDouble(double origin, double bound) {
   double r = nextDouble();
   r = r * (bound - origin) + origin;
   if (r >= bound) // correct for rounding
     r = Math.nextDown(bound);
   return r;
 }

參數(shù):

參數(shù)名稱(chēng) 參數(shù)描述
randomNumberOrigin 每個(gè)隨機(jī)值的原點(diǎn)(包括)
randomNumberBound 每個(gè)隨機(jī)值的界限(不包括)

返回:

一個(gè)偽隨機(jī) double 值流,每個(gè)都有給定的原點(diǎn)(包括)和邊界(不包括)

Throws:

Throw名稱(chēng) Throw描述
IllegalArgumentException 如果 randomNumberOrigin 大于或等于 randomNumberBound
以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)