2012-04-09 184 views
7

我见过这个问题有很多种方式,但我只需要对我在这里做什么进行一次完整性检查。c#概率和随机数

基本上我希望触发基于使用1到100之间产生的随机数具有25%的概率的事件:

int rand = random.Next(1,100); 

将以下实现这一目标?

if (rand<=25) 
{ 
    // Some event... 
} 

我想我会使用1到100之间的数字,以便稍后调整概率 - 例如,通过使用调整至23%

if (rand<=23) {...} 

感谢您的关注。

+1

你试过了吗?它应该工作正常。注意,不要在短时间窗口内重新创建许多“随机”实例,否则它们将返回相同的“随机”结果。 – mellamokb 2012-04-09 21:12:06

+0

我不想使用1到4,因为如果需要的话,我想稍后调整,但是是的,1,4会相同。谢谢斯科特,我错过了。 – CdrTomalak 2012-04-09 21:13:30

+0

这听起来是正确的。 – 2012-04-09 21:14:05

回答

5

Next(int, int)的第二个参数是所需范围结果的exclusive upper bound。因此,您应使用此:

if (random.Next(0, 100) < 25) 

,或者,如果你必须使用基于1的逻辑,

if (random.Next(1, 101) <= 25) 
+0

这很有趣,因为我认为我可以尝试使用相同的随机数通过'if((rand> 25)&&(rand <= 50)){...}来触发另一个25%的机会事件。但是我想只要按照你的建议做一系列的if语句就行了? – CdrTomalak 2012-04-09 21:19:25

+0

@CdrTomalak根本不起作用。如果您的第一个事件*被调用,则调用下一个事件的概率为零。如果第一个事件是*未被调用,则调用下一个事件的概率为1/3。如果您重复使用随机数,事件将不再独立随机;因为这两种事件都不会发生。 – phoog 2012-04-09 21:22:44

+0

@CdrTomalak另一方面,如果你想随机选择四个事件中的一个,你就走在正确的轨道上;您需要对零基数字使用'if(rand> = 25 && rand <50)',因为下限是包含性的,并且上限是包含性的。对于基于1的数字,您的表达将是正确的。 – phoog 2012-04-09 21:30:50

8

您所做的最大的错误是应该random.Next(0,100)作为documentation states

minValue:返回的随机数的包含下界。

maxValue:独占返回的随机数的上限。 maxValue必须大于或等于minValue。

Emphisis mine,exclusive表示它不包含您通过的号码,所以我的代码生成范围0-99,您的代码生成范围1-99。

所以更改您的代码

int rand = random.Next(0,100) 

if (rand < 25) //25% 
{ 
    // Some event... 
} 

//other code 
if (rand < 23) //23% 
{ 
    // Some event... 
} 

<=<的变化是因为你现在使用专用上限范围

5

您也可以使用此代码(通常为百分比计算双间0和1被使用):

double rand = random.NextDouble(); 
if(rand < .25) 
{ 
... 
+0

这应该是'if(rand <.25)';上限是独占的:http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx – phoog 2012-04-09 21:18:48

+0

谢谢。如果你不介意,我编辑了我的答案。但是,双倍没有太大的区别。 (只有当像0.249999999 ...和0.25这样的数字发挥作用时才有差别,这不会破坏1/4概率的图像) – 2012-04-09 21:20:36

+0

是的,差异非常小(精确的影响取决于NextDouble函数的多少个离散值当然可以返回)。我猜想如果算法非常敏感以至于有所作为,那么它应该首先使用真随机数而不是伪随机数。 – phoog 2012-04-09 21:27:09