【问题标题】:true or false based on probability基于概率的真假
【发布时间】:2011-10-26 23:48:21
【问题描述】:

我对运营商有点困惑,并且与随机生成一起使用。我想我只是在问这段代码是否符合我的要求?

根据我分配函数的概率生成“随机”TRUEFALSE

bool randtf(int probability) {
    if ((rand() % 100) < probability)
        return true;
    else
        return false;
}

所以如果randtf(63) 有 63% 的机会成为TRUE

任何指导将不胜感激。谢谢。

【问题讨论】:

  • rand() 从何而来?它是否返回 0 到 1(不包括)之间的随机浮点数?
  • @dgrant,如果它返回一个浮点数,% 100 会给你一个编译器错误。
  • 目前没有,它只是标准的烂 rand(),我用这个来回答问题。
  • @dgrant:我认为我们可以假设除非另有限定,否则这是标准库rand()
  • 在风格上,不要像 return truereturn false 这样。只需return (rand() % 100) &lt; probability; 也可以删除冗余...

标签: c++


【解决方案1】:

是的,第一个近似值。

不,更准确地说。 rand() 返回一个介于 0RAND_MAX 之间的数字,在实践中,它始终采用 (1 &lt;&lt; n) - 1 的形式。这不是 100 的倍数,因此在取模时不会得到完全均匀的分布。

您可以使用拒绝抽样来解决此问题。为了争论,我们假设RAND_MAX == 32767(即16位)。第一步是继续生成随机数,拒绝它们,直到获得小于 32700 的一个(小于RAND_MAX 的 100 的最大倍数)。然后,如果您对此进行取模技巧,您将获得均匀分布。

当然,这是假设rand() 的一个健全的、统计上稳健的实现,这是一个相当的假设!

【讨论】:

【解决方案2】:

MAX_RAND 不是 100 的倍数,因此您的分配在技术上是不公平的。你必须缩放 rand(),而不是修改它。

【讨论】:

  • 为什么首先因为 rand() 不是很随机?
  • @OliCharlesworth,按比例我猜他的意思是(float)rand()/RAND_MAX &lt; prob / 100.0,这有什么问题?
  • @mikerobi:因为rand 返回一个整数。输入域 [0,RAND_MAX] 和输出域 [0,99] 之间没有完美的 n 对 1 映射。 (考虑一个更简单的情况,其中 RAND_MAX 为 7,并且您想要一个介于 0 和 2 之间的随机数,包括 0 和 2)。
  • 好吧,聪明的-*$$....所以这个怪物平均会过早出现一毫秒。 :)
  • @MartyTPS:这和模组版本一样不统一;他们失败的原因相同。
【解决方案3】:

这取决于rand() 返回的内容,尤其是可能的数字范围是否是 100 的精确倍数(并且是均匀分布的)。一般来说,使用模数不一定会给您正确的统计行为。

例如,假设您的 rand() 仅返回值 0、1、2、3、4、5、6;你说rand() % 5 &lt; p0 &lt;= p &lt; 5)。但是请注意:这会两次取值 0 和 1,但在有效源编号范围内仅取值 2、3 和 4 一次!所以p = 4不要实际上得到 80% 的概率,但只有 1/7。

【讨论】:

    【解决方案4】:

    即使随机生成器是完全随机的,因为rand()只生成从0到0x7FFF的数字,它也不能完美分布。考虑以下代码:

    int arr[100] = { 0 };
    for( int i=0; i<0x7FFF; i++ ){
    arr[ i % 100 ]++;
    }
    
    for( int i=0; i<100; i++ ){
        cout << arr[i] << endl;
    }
    return 0;
    

    如果你运行这段代码,它不会给你同样的数字:

    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    328
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    327
    Press any key to continue . . .
    

    【讨论】:

    • rand() 不会生成“从 0 到 0x7fff”的数字,而是“从 0 到 RAND_MAX”,这在许多常见平台上远大于 0x7fff。不过,我同意其余的。
    • 哇,这是我的小手机上的长帖子:P
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 2021-12-21
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多