这个问题不是针对任何具体的面试或作业,只是出现在 Quora 上但没有人回答的问题。您将如何实现一个 75% 的时间返回 true 的函数(实际上是任何语言)。统计数据不是我的强项,对我来说,我会这样做但我有一个想法是错误的
void retTrue(){
srand(time(NULL));
if( (rand() % 4) == 0 ) return true;
else return false;
}
这个问题不是针对任何具体的面试或作业,只是出现在 Quora 上但没有人回答的问题。您将如何实现一个 75% 的时间返回 true 的函数(实际上是任何语言)。统计数据不是我的强项,对我来说,我会这样做但我有一个想法是错误的
void retTrue(){
srand(time(NULL));
if( (rand() % 4) == 0 ) return true;
else return false;
}
你所拥有的将有true
25% 的时间返回。
这个怎么样?
bool retTrue()
{
srand(time(NULL));
if ( (rand() % 4) == 0 ) return false;
else return true;
}
但这也会返回true
75% 的时间——每四次,就像发条一样:
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;
}
或者这也返回true
75% 的时间——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% 的时间”分布!
这是您的功能的一个潜在问题。 将返回和rand()
之间的随机整数,尽管没有真正的保证,但 RNG 旨在在此区间内生成均匀分布。但是,当您使用模运算符时,如0
RAND_MAX
(rand() % 4) == 0
您只查看随机数的底部两位。问题是,在一些随机数生成器中,低阶位的随机性可能非常弱。获得 25% 的时间发生的一系列独立随机事件的更安全方法是
((double) rand() / (double) RAND_MAX) < 0.25
rand()
作为一个元素在整个区间上的随机性[0,RAND_MAX]
比单个位的随机性更可靠。
总结评论中的建议:
在某处播种您的 RNG:
srand(time(NULL));
那么函数很简单:
bool retTrue(){
return (rand()%4 != 0);
}
您不想在函数内部调用 srand 。time() 的分辨率为 1 秒。如果我在一秒钟内调用该函数 100 次,我每次都会得到相同的结果。
Second rand 通常不是一个很好的随机数生成器,您不太可能从中获得完美的 75% 比率。
第三,您的返回类型是 void,除了编译器错误之外不会返回任何内容。
怎么样:
bool retTrue(){
static unsigned int n = 0;
n++;
return n % 4 != 0;
}
没有提到它需要是随机的。
为什么不直接使用Random Number Generator
java 生成数字。我认为这应该打印True
75% 的时间,因为rand()
生成的数字具有相同的概率。如果这是错误的,请纠正我
伪代码
int generateNumber()
{
Random r = new Random();
int seed = r.nextInt(100);
if(seed < 25){
return false;
}else
{
return true;
}
}