5 回答

TA貢獻(xiàn)1802條經(jīng)驗 獲得超6個贊
重復(fù)調(diào)用Random r = new Random();
是極其病態(tài)的,會破壞生成器的統(tǒng)計特性。(您獲得的結(jié)果很可能是系統(tǒng)時鐘時間的強(qiáng)函數(shù)。)
執(zhí)行一次該步驟,您的結(jié)果會好得多。(還有比這更有效的實現(xiàn)延遲的方法 - 考慮sleep
- Java 編譯器尚未優(yōu)化 burn 循環(huán)。)
另請注意,由于您沒有打印每個繪制的數(shù)字,因此您的觀察結(jié)果更加復(fù)雜。

TA貢獻(xiàn)1806條經(jīng)驗 獲得超8個贊
不確定這是否是您的確切問題,但您在邏輯上遇到了一些問題System.currentTimeMillis()并且只是查看當(dāng)前總時間而不是時間之間的差異。
此外,您只想在實際執(zhí)行后尋找一個新的隨機(jī)值if,這樣您就不會Random每次loop迭代都生成一個數(shù)字,而是每次生成一個敵人時,您都會為下一個敵人生成一個新的隨機(jī)值。
這是考慮到所有這些的修改后的代碼:
Random r = new Random();
long time = System.currentTimeMillis();
int cooldownTime = r.nextInt((5000 - 1000) + 1) + 1000;
while (true) {
long timeDifference = System.currentTimeMillis() - time;
if (timeDifference > cooldownTime) {
//addEnemies();
System.out.println(timeDifference); //Prints the time taken for enemy to spawn
cooldownTime = r.nextInt((5000 - 1000) + 1) + 1000;
time = System.currentTimeMillis(); //set the initial time again
}
}
這將生成一個介于 1000 和 5000 之間的隨機(jī)數(shù),并if在每次延遲后執(zhí)行該塊,重置中的值以if永遠(yuǎn)執(zhí)行此操作。
但是,很可能有更好的方法來為您的邏輯添加延遲,就像一些評論指出的那樣(sleep),但這是您的方法的更正邏輯。

TA貢獻(xiàn)1869條經(jīng)驗 獲得超4個贊
好吧,首先,您的幾個變量是在循環(huán)內(nèi)部創(chuàng)建的。您需要將對象的創(chuàng)建Random以及循環(huán)外的lastSpawn和變量移動。cooldown這是因為lastSpawn每次循環(huán)執(zhí)行 0 時變量都會被覆蓋,這意味著您總是在檢查當(dāng)前時間是否大于 0。您需要將它存儲在循環(huán)之外,以便它保留您分配給的最后一個值它。出于同樣的原因,cooldown需要在循環(huán)之外,因為您在每個循環(huán)中都會生成一個新的冷卻時間,并且System.currentTimeMillis()總是會比它大,因為System.currentTimeMillis()您可以獲得從 1970 年 1 月 1 日開始的系統(tǒng)時間偏移。最后,作為System.currentTimeMillis()由一個 long 表示,您將希望任何與時間相關(guān)的變量也很長,否則如果當(dāng)前時間(以毫秒為單位)對于整數(shù)存儲來說太高,您最終可能會溢出您的變量。
這是實現(xiàn)您想要做的事情的更好方法:
import java.util.Random;
public class RandomCooldown {
public static void main(String [] args) {
Random rand = new Random();
long start = System.currentTimeMillis();
long lastSpawn = start;
long cooldown = getCooldown(rand);
while(true) {
long time = System.currentTimeMillis();
long elapsed = (time - lastSpawn);
if(elapsed >= cooldown) {
System.out.println("Adding enemies!");
cooldown = getCooldown(rand); // only generate a new cooldown once the old cooldown has been surpassed
lastSpawn = time;
}
}
}
public static long getCooldown(Random rand) {
return (long)((rand.nextInt(4000) + 1) + 1000);
}
}
希望這可以幫助!

TA貢獻(xiàn)1765條經(jīng)驗 獲得超5個贊
這是一個我認(rèn)為你喜歡的建議。我沒有一個,而是兩個循環(huán)。外循環(huán)生成新的敵人,內(nèi)循環(huán)進(jìn)行更新(不確定這個生成敵人的線程需要更新多少,但包含它以防萬一)。
public void run() {
Random r = new Random();
// setup
while (true) {
int wait = r.nextInt((5000 - 1000) + 1) + 1000;
long time = System.currentTimeMillis();
System.out.println("Adding enemies at " + time
+ ", next add roughly in " + wait + " ms.");
while (wait + time > System.currentTimeMillis()) {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
// update
}
}
}
Random 對象被重用,調(diào)用 Thread.sleep(30) 使線程交出控制權(quán) 30 毫秒,在此期間 CPU 可以做比忙等待更有用的事情。(順便說一句,30 不是一個必須使用的神奇數(shù)字,而只是我選擇的一個數(shù)字。您需要試驗并找到最適合您游戲的數(shù)字。)
打印輸出顯示發(fā)生了什么。
Adding enemies at 1565096018610, next add roughly in 2890 ms.
Adding enemies at 1565096021530, next add roughly in 2301 ms.
Adding enemies at 1565096023863, next add roughly in 4944 ms.
Adding enemies at 1565096028813, next add roughly in 3042 ms.
Adding enemies at 1565096031879, next add roughly in 2661 ms.
... 等等。當(dāng)您運(yùn)行此代碼時,實際數(shù)字當(dāng)然不會相同但相似。
希望這對您有所幫助,祝您游戲順利!

TA貢獻(xiàn)1818條經(jīng)驗 獲得超3個贊
我覺得不錯。您可能應(yīng)該Random()
為每次迭代使用相同的實例。請記?。喝祟悰]有能力感知隨機(jī)性。或者,您可以嘗試為 Random-Generator 播種(使用Random(long seed)
構(gòu)造函數(shù)),以防您的種子發(fā)生一些奇怪的事情。
添加回答
舉報