【发布时间】:2011-10-20 10:10:35
【问题描述】:
假设我有 10 个奖品要送给 100 个人。每个人都得到一个镜头,一次一个。因此,如果第一个人未能中奖,则概率会上升,99 分之 10,等等……而且所有 10 个奖品都必须取消。
最好的写法是这样写,如果最后还有奖品,那个人将有 1 比 1 的机会获得奖品...
我是这样想的:
int playersLeft = 100
int winners = 0
while (winners < 10)
winners += (random.Next(playersLeft--)<(10-winners)) ? 1 : 0;
我想知道是否有更好或更直接的方法来做到这一点。我知道这看起来很简单,但这个简单的任务是应用程序一个非常重要的方面的一部分,它一定是正确的。
澄清:我为什么要做这样的事情:
实际上有无限数量的玩家,每个人都有 X 比 Y 的概率获胜,比如 10/100 = 10%。但是,如果我将其留给随机数生成器,则有可能在 100 名玩家中,只有 9 人会获胜,或者最坏的情况是 11 人。在我的应用程序中,我必须确保每 100 名玩家不会超过或不少于 10 人赢了。
【问题讨论】:
-
您是否意识到,如果您这样做,加入游戏会有更好和更坏的时刻吗?
-
@obrok - 是的,我知道。但任何其他方式,我必须根据情况来操纵它。例如,如果没有赢得任何价格,则强制每 X 数量的玩家获胜,或者如果已赢得所有价格,则指定在游戏期间不能再有获胜者。这就是为什么我想平均分配整个游戏的赢家。假设有 1000 名玩家,请确保前 100 人比后 100 人有 = 机会。与第 900 人给出所有价格相反,所以最后 100 人获胜的机会为 0。我不知道我是否说清楚了。
-
而且不可能等到 100 名玩家到达并分发奖品,是吗?
-
不...获胜者可以随时领取他们的奖品,他们必须在完成比赛后立即被选为获胜者或更松。
标签: c# random probability