C中随机二进制数的生成

时间:2017-08-24 14:39:02

标签: c random binary

我需要随机生成位,但位数应该是一定的比例。 说我想生成100位。 所以如果比例是3:2 它必须产生60 0和40 1。 我怎样才能在C中实现这个目标?

1 个答案:

答案 0 :(得分:1)

假设您希望概率为p的1,其中pdouble,包含范围为[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