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的种子含义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言入门20个简单程序|最新更新202
- 下一篇: 电赛机器视觉——激光点定位