1

这个问题不是针对任何具体的面试或作业,只是出现在 Quora 上但没有人回答的问题。您将如何实现一个 75% 的时间返回 true 的函数(实际上是任何语言)。统计数据不是我的强项,对我来说,我会这样做但我有一个想法是错误的

void retTrue(){
    srand(time(NULL));
    if( (rand() % 4) == 0 ) return true;
    else return false;
} 
4

5 回答 5

6

你所拥有的将有true25% 的时间返回。

这个怎么样?

bool retTrue()
{
    srand(time(NULL));
    if ( (rand() % 4) == 0 ) return false;
    else return true;
}

但这也会返回true75% 的时间——每四次,就像发条一样:

static int counter = 1;  // global or out-of-scope variable

bool retTrue_anotherOne()
{
    bool returnValue;
    if ((counter % 4) == 0)
        counter = 0;
        returnValue = false;
    else
        returnValue = true;

    counter++;
    return returnValue;
}

或者这也返回true75% 的时间——true连续 75 秒,然后是 25false秒:

static int counter = 0;  // global or out-of-scope variable

bool retTrue_anotherOne()
{
    bool returnValue;
    if (counter < 75)
        returnValue = true;
    else
        returnValue = false;

    counter = (counter + 1) % 100;
    return returnValue;
}

这完全取决于你想要什么样的“75% 的时间”分布!

于 2013-10-10T20:26:41.880 回答
3

这是您的功能的一个潜在问题。 将返回和rand()之间的随机整数,尽管没有真正的保证,但 RNG 旨在在此区间内生成均匀分布。但是,当您使用模运算符时,如0RAND_MAX

(rand() % 4) == 0

您只查看随机数的底部两位。问题是,在一些随机数生成器中,低阶位的随机性可能非常弱。获得 25% 的时间发生的一系列独立随机事件的更安全方法是

((double) rand() / (double) RAND_MAX) < 0.25

rand()作为一个元素在整个区间上的随机性[0,RAND_MAX]比单个位的随机性更可靠。

于 2013-10-11T00:54:03.257 回答
0

总结评论中的建议:

在某处播种您的 RNG:

srand(time(NULL));

那么函数很简单:

bool retTrue(){
    return (rand()%4 != 0);
} 
于 2013-10-10T20:25:02.813 回答
0

您不想在函数内部调用 srand 。time() 的分辨率为 1 秒。如果我在一秒钟内调用该函数 100 次,我每次都会得到相同的结果。

Second rand 通常不是一个很好的随机数生成器,您不太可能从中获得完美的 75% 比率。

第三,您的返回类型是 void,除了编译器错误之外不会返回任何内容。

怎么样:

bool retTrue(){
static unsigned int n = 0;
n++;
return n % 4 != 0;
}

没有提到它需要是随机的。

于 2013-10-10T20:39:05.610 回答
0

为什么不直接使用Random Number Generatorjava 生成数字。我认为这应该打印True75% 的时间,因为rand()生成的数字具有相同的概率。如果这是错误的,请纠正我

伪代码

 int generateNumber()
  {
     Random r = new Random();
     int seed = r.nextInt(100);
     if(seed < 25){
     return false;
     }else
     {
     return true;
     }        
  }
于 2013-10-10T20:43:46.597 回答