2015-05-26 268 views
0

我使用生成我的遊戲的隨機數:僞隨機數生成

System.Random rnd = new System.Random(); 
int TileType = rnd.Next (0, 8); 

的問題是,這些數字是太過隨意。數字與瓦片有關,並且我沒有獲得20卷的特定瓦片。

我需要製作一個生成「假」隨機數的函數的指導。所以基本上我想確保我生成x卷的每個瓷磚類型。我想12可能是x的一個很好的起點,但希望能夠調整x。

如果有人能指出我在正確的方向,將不勝感激。

更新

繼承人什麼,我想現在。感謝@Golo以這種方式指向我。思考?

  1. 創建我想要的號碼列表。
  2. 添加更多的隨機數。
  3. Shuffle list -var shuffledList = unshuffledList.OrderBy(x => rand.Next())。ToList();
  4. 抓住第一個項目並從列表中移除。
  5. 空白時重建列表。

這應該意味着所有的數字都會頻繁出現,但是您仍然可以重複,因此它會保持隨機的感覺。

+0

您正在尋找 「洗牌」 或 「加權隨機數」(根據您的喜好)。 –

回答

4

用您想要的數字創建一個列表,然後從該列表中隨機選擇一個元素並將其刪除。

重複此操作,直到列表爲空,然後重新開始。

這樣,你會在n嘗試讓每個數字一次,但它們的順序是隨機的。

+0

不錯。唯一的事情(如果我正確地理解OP)n(8)不同於x(12)。 – publicgk

+0

或者使用任何其他的隨機碼(選擇和刪除易於編碼,但由於大量的複製操作,對於大型列表可能會有非常可疑的性能)。 –

+0

關閉,除非我再次看不到值n,直到所有其他值都被滾動。我不認爲我會對此感到滿意。 –

2

我喜歡@Golo的回答,只是爲了增加一個不同的旋轉。 。 。

這聽起來像他的迴應只會給你每個值一次。 (即:你不會看到值,直到所有其他值「滾動」一旦名詞)

爲了保持真正隨機的,而稍微更加可預測,嘗試加權隨機數發生器。

每個選擇之後,可以0出所選擇的項目的(降低下一個被選擇的它的機會,並增加選擇「最老的」未被選擇的值的機會。)的重量

這些不是在.Net中,但應該讓你開始使用算法。

http://www.perlmonks.org/?node_id=242744
http://peterkellyonline.blogspot.com/2012/02/weighted-random-selection-in-php.html