C#概率和随机数

13

我想要根据生成的1到100之间的随机数,以25%的概率触发事件,使用以下代码:

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

以下代码能实现这个目的吗?

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

我打算使用1到100之间的数字,这样以后可以调整概率 - 比如通过使用

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

1
你试过了吗?它应该可以正常工作。只要小心不要在短时间内重新创建许多Random实例,否则它们将返回相同的“随机”结果。 - mellamokb
我不想使用1到4,因为如果需要的话我想稍后进行调整,但是是的,1,4将是相同的。谢谢Scott,我错过了那个。 - CdrTomalak
听起来差不多正确。 - Nachiket Mehta
1
是的,我在一周左右之前犯了那个错误 - 我将随机对象创建为实例变量来解决这个问题。 - CdrTomalak
3个回答

14
你犯的最大错误是应该使用random.Next(0,100),正如文档所述
 

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

   

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

强调我的是,排除上限意味着它不包括您传递的数字,因此我的代码生成范围为0-99,而你的代码生成范围为1-99。

所以请将你的代码更改为

int rand = random.Next(0,100)

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

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

<=更改为<是因为您现在使用的是排除上限范围。


10
< p > < code >Next(int, int) 的第二个参数是所需结果范围的独占上限。因此,您应该使用以下内容:

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

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

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

这很有趣,因为我在想是否可以使用相同的随机数通过'if ((rand>25)&&(rand<=50)) {...}来触发另一个25%的概率事件。但是我猜像你建议的一样只需要一系列的if语句也可以实现? - CdrTomalak
@CdrTomalak,那样根本行不通。如果第一个事件被调用了,那么调用下一个事件的概率为零。如果第一个事件没有被调用,则调用下一个事件的概率为1/3。如果您重复使用随机数,则这些事件将不再是独立随机的;因为两个事件都发生的可能性将不存在。 - phoog
如果你想要从四个事件中随机选择一个,那么你走对了路线;你需要使用 if (rand >= 25 && rand < 50) 来处理基于零的数字,因为下限是包括在内的,上限也是包括在内的。对于基于1的数字,你的表达式是正确的。 - phoog
我没有考虑在第一个 if 块内测试 'if ((rand>25)&&(rand<=50))',而是紧接着在其后面进行测试。在这种情况下,如果第一个事件未被调用,则可能会调用第二个事件。这有点令人困惑,但我认为你可能是正确的,我应该在每次测试之前生成一个新的随机数。 - CdrTomalak
@CdrTomalak 当第一个事件没有被触发时,您是否希望第二个事件有1/4的几率发生?如果是这样,请生成一个新的数字。其中一个事件发生的概率为47.75%。否则,如果您想要1/3的几率,可以重复使用先前的数字。其中一个事件发生的概率为50%。 - phoog

8
您可以使用以下代码(通常用于百分比计算,使用0到1之间的双倍数):
double rand = random.NextDouble();
if(rand < .25)
{
...

应该是 if (rand < .25);上限是排除在外的:http://msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx - phoog
谢谢。如果您不介意的话,我已经编辑了我的回答。但是对于double类型来说,这并没有太大的区别。(只有当像0.249999999...和0.25这样的数字出现时,才会有所不同,但这并不会破坏1/4概率的图像) - Andriy Buday
是的,差别非常小(当然,具体影响取决于NextDouble函数可能返回的离散值数量)。我想,如果算法对此如此敏感,那么它应该首先使用真正的随机数而不是伪随机数。 - phoog
@OlivierJacot-Descombes 是的,Andriy 最初写的是 if (rand <= .25) ,但他在 5 分钟的编辑窗口内进行了更改。 - phoog
2
现在,我们都更聪明了 :-) - Olivier Jacot-Descombes
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接