日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java random 种子数_JAVA:Random的种子含义

發布時間:2023/12/31 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java random 种子数_JAVA:Random的种子含义 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Random類的基值seed是什么意思?

比如:

Random ran1=new Random();

Random ran2=new Random(12345);

這兩個有什么區別啊?運行結果沒區別啊!

生成隨機數

Random random = new Random();

Random random = new Random(100);//指定種子數100

random調用不同的方法,獲得隨機數。

如果2個Random對象使用相同的種子(比如都是100),并且以相同的順序調用相同的函數,那它們返回值完全相同。如下面代碼中兩個Random對象的輸出完全相同

import java.util.*;

class TestRandom {

public static void main(String[] args) {

Random random1 = new Random(100);

System.out.println(random1.nextInt());

System.out.println(random1.nextFloat());

System.out.println(random1.nextBoolean());

Random random2 = new Random(100);

System.out.println(random2.nextInt());

System.out.println(random2.nextFloat());

System.out.println(random2.nextBoolean());

}

}

====================================================================

一般計算機的隨機數都是偽隨機數,以一個真隨機數(種子)作為初始條件,然后用一定的算法不停迭代產生隨機數,下面介紹兩種方法:

一般種子可以以當前的系統時間,這是完全隨機的

。

算法1:平方取中法。

1)將種子設為X0,并mod 10000得到4位數

2)將它平方得到一個8位數(不足8位時前面補0)

3)取中間的4位數可得到下一個4位隨機數X1

4)重復1-3步,即可產生多個隨機數

這個算法的一個主要缺點是最終它會退化成0,不能繼續產生隨機數。

算法2:線性同余法

1)將種子設為X0,

2)用一個算法X(n+1)=(a*X(n)+b) mod c產生X(n+1)

一般將c取得很大,可產生0到c-1之間的偽隨機數

該算法的一個缺點是會出現循環。

JDK中關于Random的構造函數敘述如下:

[code]public Random()創建一個新的隨機數生成器。此構造方法為隨機數生成器的種子設置某個值,該值與此構造方法的所有其他調用所用的值完全不同。public Random(long seed)使用單個 long 種子創建一個新隨機數生成器:public Random(long seed) { setSeed(seed); }next 方法使用它來保存隨機數生成器的狀態。參數:[code]seed - 初始種子。

[/code]另請參見: Random的setSeed(long)public void setSeed(long seed)使用單個 long 種子設置此隨機數生成器的種子。setSeed的常規協定是它更改此隨機數生成器對象的狀態,使其狀態好像是剛剛使用參數 seed作為種子創建它的狀態一樣。Random 類按如下方式實現 setSeed 方法:synchronized public void setSeed(long seed) {

this.seed = (seed ^ 0x5DEECE66DL) & ((1L << 48) - 1);

haveNextNextGaussian = false;

}由 Random 類實現的 setSeed 恰好只使用 48位的給定種子。但是,通常重寫方法可能使用 long 參數的所有 64 位作為種子值。 注:盡管種子值是一個基本的AtomicLong,但仍必須對此方法同步,確保 haveNextNextGaussian 的語義正確。

參數:seed - 初始種子。

觀察如下的代碼public class Test {

public static void main(String args[]) throws Throwable {

for(inti=0;i<10;i++)

System.out.print((new Random(10)).nextInt(10));

for(intj=0;j<10;j++)

System.out.print((new Random()).nextInt(10));

}

}

輸出接結果是:33333333333012603015

當為其指定種子為10時,隨機出來的數是相同的,不指定時隨機的數是大多不相同的。

因為在不指定種子的構造函數時系統根據當前時間生成種子,每個種子對應一個數列,相同的種子會得到相同數列,而不是數值。所以如果在構造函數中指定種子,會得到同一個數列。

實際上Random是一種偽隨機數,相同的種子產生相同的序列(注意不是相同數值)。

Random的nextInt實現如下,依賴于next

public int nextInt(int n) {

if (n <= 0)

throw new IllegalArgumentException("n must be positive");

if ((n & -n) == n) // i.e., n is a power of 2

return (int)((n * (long)next(31)) >>31);

int bits, val;

do {

bits = next(31);

val = bits % n;

} while (bits - val + (n-1) < 0);

return val;

}

next方法實現如下:

protected int next(int bits) {

long oldseed, nextseed;

AtomicLong seed = this.seed;

do {

oldseed = seed.get();

nextseed = (oldseed * multiplier + addend) &mask;

} while (!seed.compareAndSet(oldseed, nextseed));

return (int)(nextseed>>> (48 -bits));

}

next依賴于seed生成一個隨機數,如果seed相同則生成同一隨機數列。

觀看如下代碼:

Random rand = new Random(47);

Random rand2 = new Random(47);

int i =rand.nextInt(100);

int j =rand.nextInt(100);

int i1 =rand2.nextInt(100);

int j1 =rand2.nextInt(100);

System.out.print(i+".");

System.out.print(j+".");

System.out.print(i1+".");

System.out.print(j1+".");

結果:58.55.58.55.

說明得到的是同一值序列而非同一個值。

[/code]

總結

以上是生活随笔為你收集整理的java random 种子数_JAVA:Random的种子含义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。