2010-03-20 171 views
2

我正在爲我的遊戲創建隨機值以在屏幕上顯示敵人。但它有時顯示2個在一起有時3 ...我想問的是這是一個用於創建隨機值的最佳FORMUL ..這是我迄今爲止隨機值什麼是創建隨機值的最佳方式?

random = 1 * (int) (Math.random() * 100); 
+1

@Meko:但你真的* *想要(僞)隨機?對於最終用戶來說,有時「假隨機」會給出比真隨機更好的「隨機錯覺」。所以你可能*想要丟棄,例如,* random *中給出的僞隨機值,它們與* lastrandom *(你會記住)太接近。例如,在屏幕上(173,173)隨機彈出的三個敵人是可能的(儘管不太可能),但用戶可能更喜歡它,如果你的遊戲有一個安全網,防止「下一個隨機」距離最後一個隨機值小於20個像素... – SyntaxT3rr0r 2010-03-20 20:33:54

回答

2

您可以使用java.util.Random

Random random = new Random(); // uses System.nanoTime() as seed 
int enemies = random.nextInt(100); 

無論如何,你的方法也很好,因爲它實際上與上述相同(幕後)。

您可以打印一個由您自己生成的100個隨機數字序列,並親自查看是否存在問題。

2

如果完美的話,你會用什麼。

如果你想要的東西simplier你可能會想用Random類是這樣的:

Random generator = new Random(seed); 
int number = generator.nextInt(100); 
3

其實真正的隨機隨機數的產生是在自己的權利的複雜的遊戲。關於這個問題的文章將讓你深入瞭解其中的複雜性。如上所述的簡單近似可能足以滿足遊戲的目的,但是,應該指出的是,傾向於不時出現「斑點」。

5

「但它有時顯示2個在一起有時3」

考慮完全隨機的號碼......在從0到99,每100個隨機值,你會發現1.0雙打的平均值。對於每10,000個值,平均每三次發生一次。鑑於千萬隨機數,java.util.Random的yeilds我的機器上,結果如下:

Doubles: 99873 
Triples: 985 

Double Rate: 1 in 100 
Triple Rate: 1 in 10152

的源代碼:

import static java.lang.System.*; 

import java.util.Random; 

public class Sandbox { 
    public static final int NUM_ITERATIONS = 10000000; 
    public static void main(String[] args) { 
     Random rand = new Random(); 

     int cur; 
     int last = -1; 
     int secondLast = -2; 
     int nDoubles = 0; 
     int nTriples = 0; 

     for (int i = 0; i < NUM_ITERATIONS; i++) { 
      cur = rand.nextInt(100); 
      if (cur == last) { 
       nDoubles++; 
       if (cur == secondLast) nTriples++; 
      } 
      secondLast = last; 
      last = cur; 
     } 

     out.println("Doubles: " + nDoubles); 
     out.println("Triples: " + nTriples); 
     out.println(); 
     out.println("Double Rate: 1 in " + Math.round(1.0 * NUM_ITERATIONS/nDoubles)); 
     out.println("Triple Rate: 1 in " + Math.round(1.0 * NUM_ITERATIONS/nTriples)); 

     exit(0); 
    } 
}
相關問題