2011-10-29 84 views
6

我正在C#中使用平滑地形生成算法並使用XNA來顯示數據。隨機對象不在C中配置#

我這樣做是爲了在每次迭代之間的每個點之間創建一個新的點,在兩者之間的隨機高度處。這工作正常,並且我已經設置了它,以便在第二次迭代時它會像第二張幻燈片一樣選擇一個隨機點,而不是嘗試在位於同一軸上的點之間創建一個新點。

正在發生的事情是,循環使用從先前的迭代相同的隨機值:http://i.stack.imgur.com/UmWr7.png

這不是理想的明顯,因爲它不是一個適當的隨機生成。

如果我使用一個Thread.Sleep(20)每個點後一代是否能夠正常工作:http://i.stack.imgur.com/KziOg.png

我不希望有使用Sleep解決方法如果可能的話,因爲它是很慢的,我想用這個即時的。我很確定這與C#垃圾收集器有關。

這是我獲取點編碼

Random r = new Random(); 
int x = (p1.X + p2.X)/2; 
int y; 
if (!initial) 
     y = r.Next(Math.Min(p1.Y, p2.Y), Math.Max(p1.Y, p2.Y)); 
else 
     y = r.Next(Math.Min(p1.Y, p2.Y) - Game1.screenHeight/2, Math.Max(p1.Y, p2.Y) + Game1.screenHeight/2); 
return new Point(x, y); 

是垃圾收集問題的一部分?

有關解決此問題的任何建議或解決方案?

回答

10

可能您正在循環中創建一個新的Random對象。

for (/* ... */) { 
    int x = new Random().Next(); // Don't do this! 
    // ... 
} 

嘗試在程序啓動時只創建一個Random實例,然後重新使用它。如果你有多個線程,那麼你可以爲每個線程使用一個隨機對象。

+0

啊不能相信我沒有看到這個。非常感謝幫忙。 – FrenchyNZ

6

聽起來好像你可能在每次迭代中創建一個新實例Random 。這將從目前的時間中獲得種子 - 因此,如果沒有睡眠,你會重複獲得相同的價值;睡一覺,你最終會得到不同的種子。

答案是重用整個程序一個Random實例 - 但注意到一個事實,即Random不是線程安全的。如果你的所有工作都是在UI線程中完成的,那麼你會好起來的 - 但除此之外,你可能想要使用我在我的article about Random中提供的一種方法(更多地討論這個問題)。


是的,現在你已經張貼的確是這樣的代碼。

+0

感謝關於隨機不是「線程安全」的信息也非常有用 – FrenchyNZ