2012-02-07 123 views
1

隨機遊走是一個隨機過程,粒子在結構化空間中從一個狀態移動一個狀態到一個狀態。對於我們來說,狀態空間是Z,整數集合。粒子以初始狀態S [0]∈Z開始。如果i≥0步後粒子處於狀態S [i],那麼在步驟i + 1中,它移動到狀態S [i] +1概率p,並以概率q表示狀態S [i] - 1;它不能靜止不動。當然,p + q = 1。如果S [0] = 5並且0,則序列5,4,3,4,3,2,3,2,3,4是可能的序列如果粒子移動9次,則爲粒子聲明狀態。Java中的隨機遊動

編寫一個程序,該程序將模擬隨機遊走給定數量的步驟,並將計算隨機遊走的某些統計數據。模擬參數來自標準輸入作爲單行參數,包括(1)初始狀態S [0]; (2)p的值;和(3)模擬的步驟數。

注:我正在用Java編寫它。 到目前爲止,我有:

public static void main(String[] args) { 

    Random rand = new Random(); 
    int iState = rand.nextInt(); 
    int particle = iState; 
    double pValue = 0.60; 
    int numSteps = rand.nextInt() + 1; 
    int nSteps = 0; 

    if (numSteps>=0) { 
     System.out.println(particle); 
     while (nSteps<numSteps); { 

      if (rand.nextDouble() < pValue) 
       particle++; 

      else 
       particle--; 

      System.out.println(particle); 
      nSteps++; 

     } 

    } 

有些東西似乎不過是想錯了,所以我堅持。

編輯:謝謝你們,不知何故,我沒有看到那個分號。

// ------------------------------------------- ---------------------------------------------

編輯2:好吧,所以我的代碼正常工作;但是,最終我應該列出最大值,最小值和平均值。這可能不會爲每個iState值創建一個新變量嗎?我的新代碼是

public static void main(String[] args) { 

    Random rand = new Random(); 
    int iState = rand.nextInt(); 
    double pValue = 0.60; 
    int numSteps = rand.nextInt(100) + 1; 
    int nSteps = 0; 

    if (numSteps>=0) { 
     System.out.println(iState); 
     while (nSteps<numSteps) { 

      if (rand.nextDouble() < pValue) 
       iState++; 

      else 
       iState--; 

      System.out.println(iState); 
      nSteps++; 
+1

究竟是什麼問題? – 2012-02-07 02:27:08

+0

它只打印出一個值。我需要它打印出粒子的所有值,直到nSteps等於numSteps! – helloimbarbara 2012-02-07 02:28:44

回答

6

認爲您的問題是,你需要刪除分號該行

while (nSteps<numSteps); { 

此外,您幾乎肯定不想重複了rand.nextInt() + 1步驟,因爲rand.nextInt()可能是負面的。您可能的意思是rand.nextInt(n),其中n是一些上限,或者您可能只是將其設置爲n

更新:如果您需要跟蹤的最小值,最大值和平均值,你可能做這樣的事情

int min = iState; // initial value 
int max = iState; // initial value 
long total = iState; // initial value 

然後,每次迭代之後,你說

min = Math.min(min, iState); 
max = Math.max(max, iState); 
total += iState; 

,然後在迭代結束時,您的最小值爲min,最大值爲max,平均值爲(double) total/numSteps

+0

我對你的意思有點困惑。程序只在(numSteps> = 0)時運行? – helloimbarbara 2012-02-07 04:00:51

+0

正確...因爲否則,您會試圖以小於零的步驟運行您的程序,最終會導致「完全沒有運行」。 – 2012-02-07 04:02:25

+0

謝謝你!!!!! – helloimbarbara 2012-02-07 04:26:48

1

在爲while循環聲明條件後,您有一個分號。簡單地刪除它,它應該工作。

while (nSteps<numSteps); 
1

看你的分號!

while (nSteps<numSteps); {應該是while (nSteps<numSteps) {

+0

呃,愚蠢的分號。 – helloimbarbara 2012-02-07 02:40:53

0

執行bernoulli函數來確定對於給定的p和q哪個狀態要移動。例如)因爲p = 0.6 =。 Q = 0.4。使用10個球,6個紅色,4個藍色並挑選一個球,看看它是什麼顏色。如果它的紅色,去狀態+ 1,如果它的藍色,去狀態-1。

因此,您可以隨機生成1-10,1-6代表紅色,7-10代表藍色。使用rand.nextInt(10)+1表示1到10.

另外,如果不打算在別處使用它(istate和particle),則不必使用2個變量來表示相同的事物。