【问题标题】:c# probability and random numbersc# 概率和随机数
【发布时间】:2012-04-09 21:10:06
【问题描述】:

我已经看到以多种方式提出这个问题,但我只需要对我在这里所做的事情进行全面检查。

基本上,我想根据 1 到 100 之间生成的随机数触发一个概率为 25% 的事件:

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

下面会实现这个吗?

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

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

调整到 23%
if (rand<=23) {...}

感谢观看。

【问题讨论】:

  • 你试过了吗?它应该可以正常工作。请注意不要在短时间内重新创建许多 Random 实例,否则它们将返回相同的“随机”结果。
  • 我不想使用 1 到 4,因为我想稍后根据需要进行调整,但是是的,1,4 是一样的。谢谢斯科特,我错过了。
  • 听起来不错。
  • 是的,我大约一周前犯了这个错误 - 我创建了随机对象作为实例变量来解决这个问题。

标签: c# random probability


【解决方案1】:

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

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

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

Emphisis 我的,独占意味着它不包括您传入的数字,所以我的代码生成范围 0-99,而您的代码生成范围 1-99。

所以把你的代码改成

int rand = random.Next(0,100)

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

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

&lt;= 更改为&lt; 是因为您现在使用的是独占上限范围

【讨论】:

    【解决方案2】:

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

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

    或者,如果你必须使用从 1 开始的逻辑,

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

    【讨论】:

    • 这很有趣,因为我想我可以通过以下方式尝试使用相同的随机数触发另一个 25% 的机会事件:'if ((rand>25)&&(rand
    • @CdrTomalak 这根本行不通。如果您的第一个事件调用,则调用下一个事件的概率为零。如果第一个事件没有被调用,那么调用下一个事件的概率是 1/3。如果重复使用随机数,事件将不再是独立随机的;因为这两种情况都不可能发生。
    • @CdrTomalak 另一方面,如果您想随机选择四个事件中的一个,那么您就在正确的轨道上;对于从零开始的数字,您需要使用 if (rand &gt;= 25 &amp;&amp; rand &lt; 50),因为下限包含在内,上限也包含在内。对于从 1 开始的数字,您的表达式是正确的。
    • 我并没有考虑在第一个 if 块中测试 'if ((rand>25)&&(rand
    • @CdrTomalak 当第一个事件没有被调用时,你希望第二个事件有 1/4 的机会发生吗?如果是,则生成一个新号码。一个事件发生的概率为 47.75%。否则,如果您想要 1/3 的机会,您可以重复使用以前的数字。有 50% 的机会发生一件事。
    【解决方案3】:

    您也可以使用此代码(通常用于百分比计算,使用介于 0 和 1 之间的 double):

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

    【讨论】:

    • 应该是if (rand &lt; .25);上限为独占:msdn.microsoft.com/en-us/library/system.random.nextdouble.aspx
    • 谢谢。如果您不介意,我编辑了我的答案。但是对于双倍来说并没有太大的区别。 (区别仅在于 0.249999999... 和 0.25 这样的数字发挥作用时,不会破坏 1/4 概率的图像)
    • 是的,差异非常小(当然,确切的影响取决于 NextDouble 函数可以返回多少离散值)。我想如果算法非常敏感以至于这会产生影响,那么它应该首先使用真正的随机数而不是伪随机数。
    • @phoog。数字范围是0.0 &lt;= random &lt; 1.0,因此&lt; 0.25 是正确的!您有四个季度[0.0 &lt;= x &lt; 0.25][0.25 &lt;= x &lt; 0.5][0.5 &lt;= x &lt; 0.75][0.75 &lt;= x &lt; 1.0],它们的大小完全相同。
    • 现在,我们都更聪明了 :-)
    猜你喜欢
    • 2017-11-26
    • 2011-04-10
    • 1970-01-01
    • 2018-07-11
    • 2020-07-13
    • 2013-12-18
    • 2018-01-09
    • 2017-05-16
    • 1970-01-01
    相关资源
    最近更新 更多