我需要随机生成位,但位数应该是一定的比例。 说我想生成100位。 所以如果比例是3:2 它必须产生60 0和40 1。 我怎样才能在C中实现这个目标?
答案 0 :(得分:1)
假设您希望概率为p
的1,其中p
为double
,包含范围为[0.0,1.0]。
然后你可以使用下面rand_bit()
的逻辑。
#include <stdio.h>
#include <stdlib.h>
int rand_bit(double p){
if(p==1.0){//Unusual but OK exact comparison of double.
return 1;
}
double r=((double)rand())/((double)RAND_MAX);
return r<p?1:0;
}
//Demonstration...
int main(void) {
srand(78721);//Demonstration is reproducible....
const int test=1000000;
int count=0;
double p=0.6;//60% 1s.
for(int i=1;i<=test;++i){
count+=rand_bit(p);
}
double prop=((double)count)/((double)test);
printf("%f (error=%f)\n",prop,(prop-p));
return 0;
}
典型输出:
0.600500 (error=0.000500)
请记住使用srand()
为随机数生成器播种。如上所示传递固定值以获得可重现的结果,或者srand((int)time(NULL));
以获得不同的结果运行。
另请注意,C中的内置随机数生成器通常不是很好。 它们通常适用于游戏,可以为业务应用程序生成测试用例,但通常不适合科学模拟和加密无价值。
条件if(p==1.0)
就在那里我们可以确保p==1.0
始终返回1。 p==0.0
确保了r<p
。