C# 球彩票算法

C# 球彩票算法,c#,algorithm,C#,Algorithm,每个彩票玩家都有一个“球数”属性(0-100的整数) 球员1得到60个标记为0到59的球 球员2得到20个标记为60 79的球 球员3得到80个标记为80比159的球 然后从袋子里挑一个球,谁被选中谁就赢。显然,他们包里的球越多,他们被选中的机会就越大 起初,我认为编写his代码的最佳方法是使用一个数组,其中每个索引充当球,并存储一个对象(球员)。但是,有一个包含100个对象的阵列只是为了挑选玩家然后继续(这是一个小功能),这似乎有点过火(并且不能很好地扩展) 然后,我考虑标记范围(即忽略中

每个彩票玩家都有一个“球数”属性(0-100的整数)

  • 球员1得到60个标记为0到59的球
  • 球员2得到20个标记为60 79的球
  • 球员3得到80个标记为80比159的球
然后从袋子里挑一个球,谁被选中谁就赢。显然,他们包里的球越多,他们被选中的机会就越大

起初,我认为编写his代码的最佳方法是使用一个数组,其中每个索引充当球,并存储一个对象(球员)。但是,有一个包含100个对象的阵列只是为了挑选玩家然后继续(这是一个小功能),这似乎有点过火(并且不能很好地扩展)

然后,我考虑标记范围(即忽略中间的数字),因此如果数字介于0和59之间,则必须是玩家1获胜(即具有下限和上限)。但我希望得到一些反馈,因为可能有一种非常简单的方法(我没有)来做到这一点。

试试这个:

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);
struct播放器
{
int最低值;
int最高值;
}
球员名单=新名单(
{
新播放器(){0,59},
新玩家(){60,79},
新播放器(){80159}
});
随机r=新随机();
int rVal=r.Next(0,players.Last().HighestValue+1);
玩家赢家=玩家。单人(s=>s.LowestValue=rVal);
显然,您可以在结构中放置更多的范围号。我想你需要更多与玩家相关的数据


还要注意的是,
Random.Next(Int32,Int32)
返回的值介于最低值(包含)和最高值(排除)之间,因此我们必须将一个值添加到
最高值中
您不需要存储范围,只需要存储概率,或者在您的情况下,不需要存储球的数量

球员1有60个球。您可以将其直接存储为
int
60。玩家2有20个,所以储存20个。等等

然后计算球的总数(一次,如果静态已知,则硬编码),并在0(包括)和球数(排除)之间绘制一个随机数


在球员身上打圈,在你打圈时把他们的球数加起来。返回第一个累计球数高于随机数的球员。

射程有什么问题?我认为这是最好的选择,而且可以很好地扩展。你的问题是…?范围很好,但你必须跟踪被调用的数字。如果再次调用相同的号码,请忽略它。@NickUdell-没有代码可供查看。@Hank没有在这里发布,当然。这就是为什么我说“提供你的实现”而不是“复制这个答案”。先生,你是个天才。这正是我要找的!