我写了以下功能
bool random_bool(double probability) { double p_scaled = probability * (RAND_MAX+1) - rand(); if ( p_scaled >= 1 ) return true; if ( p_scaled <= 0 ) return false; return random_bool( p_scaled ); }
给定,rand()
从均匀分布生成一个{0,1,...,RAND_MAX-1,RAND_MAX}
数字,后续调用中的数字可以被视为独立于除加密之外的所有实际目的,这应该true
以概率返回p
:两个if
语句true
以略低于概率的方式返回p
,并且false
概率略高于1-p
,而递归调用处理其他所有事情.
但是,以下测试失败:
long long N = 10000000000; //1e10 double p = 10000.0 / N; int counter = 0; for (long long i=0;i断言语句仅在0.1%的情况下失败.但它始终失败(
counter
介于10600和10700之间).怎么了?
PS:我看过这个问题,但没有帮助......