我正在爲我的遊戲創建隨機值以在屏幕上顯示敵人。但它有時顯示2個在一起有時3 ...我想問的是這是一個用於創建隨機值的最佳FORMUL ..這是我迄今爲止隨機值什麼是創建隨機值的最佳方式?
random = 1 * (int) (Math.random() * 100);
我正在爲我的遊戲創建隨機值以在屏幕上顯示敵人。但它有時顯示2個在一起有時3 ...我想問的是這是一個用於創建隨機值的最佳FORMUL ..這是我迄今爲止隨機值什麼是創建隨機值的最佳方式?
random = 1 * (int) (Math.random() * 100);
您可以使用java.util.Random
:
Random random = new Random(); // uses System.nanoTime() as seed
int enemies = random.nextInt(100);
無論如何,你的方法也很好,因爲它實際上與上述相同(幕後)。
您可以打印一個由您自己生成的100個隨機數字序列,並親自查看是否存在問題。
如果完美的話,你會用什麼。
如果你想要的東西simplier你可能會想用Random類是這樣的:
Random generator = new Random(seed);
int number = generator.nextInt(100);
其實真正的隨機隨機數的產生是在自己的權利的複雜的遊戲。關於這個問題的文章將讓你深入瞭解其中的複雜性。如上所述的簡單近似可能足以滿足遊戲的目的,但是,應該指出的是,傾向於不時出現「斑點」。
...有時77,有時23等,如預期在uniform distribution?
如果你想爲normal distribution而不是你的「敵人」,使極端不太可能,它seems to be there in Java。
「但它有時顯示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);
}
}
@Meko:但你真的* *想要(僞)隨機?對於最終用戶來說,有時「假隨機」會給出比真隨機更好的「隨機錯覺」。所以你可能*想要丟棄,例如,* random *中給出的僞隨機值,它們與* lastrandom *(你會記住)太接近。例如,在屏幕上(173,173)隨機彈出的三個敵人是可能的(儘管不太可能),但用戶可能更喜歡它,如果你的遊戲有一個安全網,防止「下一個隨機」距離最後一個隨機值小於20個像素... – SyntaxT3rr0r 2010-03-20 20:33:54