2014-05-01 91 views
-5

每個彩票遊戲者具有屬性 「的球數」(從0一個int - 100)球彩票算法

  • 播放器1得到60米的球標記0到59
  • 播放器2得到20個球標記60 79
  • 播放機3得到80個球80標記到159

甲球隨後從袋拾取,誰得到選擇獲勝。很明顯,他們在球包中擁有的球越多,他們被選中的機會就越多。

最初我認爲編碼他的最好方法是創建一個數組,其中每個索引用作球,並存儲一個對象(玩家)。但是它看起來有點矯枉過正(並且不能很好地擴展),讓一個擁有100個對象的數組只是爲了挑選玩家然後繼續前進(這是一個小功能)。

然後我想到了有標記的範圍(即解除中間的數字),所以如果數字在0到59之間,它必須是贏家(即具有下限和上限)的玩家1。但我想要一些反饋,因爲可能有一個非常簡單的方法(我錯過了)來做到這一點。

+0

做範圍有什麼問題?我認爲這是最好的選擇,並且可以很好地擴展。 –

+1

而你的問題是...? – rene

+0

範圍很好,但你必須跟蹤已被調出的數字。如果再次調用相同的號碼,請忽略它。 – bytefire

回答

1

你並不需要存儲範圍,只有概率,或在你的情況下,他們有多少球。

玩家1有60個球。您可以將其直接存儲爲int 60.播放器2有20個,因此存儲20個。依此類推。

然後計算球的總數(一次,或硬編碼它,如果它已知靜態),並繪製0(包括)和球數(不包括)之間的隨機數。

循環播放器,當你循環時加起來它們的球數。返回累計球數高於隨機數的第一位玩家。

+0

你先生是個天才。這正是我期待的! – user3585831

0

試試這個:

struct Player 
{ 
    int LowestValue; 
    int HighestValue; 
} 

List<Player> players = new List<Player>(
{ 
    new Player() { 0,59}, 
    new Player() {60,79}, 
    new Player() {80,159} 
}); 

Random r = new Random(); 
int rVal = r.Next(0,players.Last().HighestValue+1); 
Player winner = players.Single(s=> s.LowestValue <= rVal && s.HighestValue >= rVal); 

很明顯,你可以把不僅僅是那些數字範圍多在你的結構。我假設你想要更多與你的球員相關的數據。

還要注意的是Random.Next(Int32, Int32)回報值之間的最低(含)和最高(獨家),所以我們必須添加一個到HighestValue