75%的时间打印真实的功能

时间:2013-10-10 20:16:00

标签: algorithm

这个问题不适用于任何特定的访谈或任务,只是一个问题出现在Quora上,但没有人回答。 你将如何实现一个在75%的时间内返回真实的函数(真正的任何语言)。统计数据不是我的强项,对我来说,我会这样做,但我有一个错误的是

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

5 个答案:

答案 0 :(得分:6)

你所拥有的将在25%的时间内返回true

这个怎么样?

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

但是这也会在75%的时间内返回true - 每隔四次,就像发条一样:

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;
}

或者这也会在75%的时间内返回true - 连续75 true,然后25 false s:

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%的时间”的分布情况!

答案 1 :(得分:3)

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

(rand() % 4) == 0

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

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

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

答案 2 :(得分:0)

总结评论中的建议:

将你的RNG种在某个地方:

srand(time(NULL));

然后功能很简单:

bool retTrue(){
    return (rand()%4 != 0);
} 

答案 3 :(得分:0)

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

第二兰特通常不是一个非常好的随机数发生器,你不可能从中得到完美的75%比率。

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

怎么样:

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

没有提及它需要随机。

答案 4 :(得分:0)

为什么不在java中使用Random Number Generator生成数字。我认为这应该打印True给定rand() 75%的时间生成概率相等的数字。如果这是错误的话,请纠正我

<强>伪代码

 int generateNumber()
  {
     Random r = new Random();
     int seed = r.nextInt(100);
     if(seed < 25){
     return false;
     }else
     {
     return true;
     }        
  }