【问题标题】:Generation of Random Binary Numbers in CC中随机二进制数的生成
【发布时间】:2017-08-24 14:39:01
【问题描述】:

我需要随机生成位,但位的数量应该是一个确定的比例。 假设我想生成一个 100 位。 所以如果比例是 3:2 它必须生成 60 个 0 和 40 个 1。 我将如何在 C 中实现这一目标?

【问题讨论】:

  • 查看rand 函数。也许像int operation = if (rand() > RAND_MAX / proportion);?.
  • “确定比例”是什么意思?均匀分布,0 和 1 完全相等,或者不是 50/50 的比例?
  • ...但有一定的比例。 ...到底是什么意思?您的意思是您想要一个生成二进制数 0 和 1 的函数(您没有指定的数量),并且该函数的输入是它们中需要为 1 的百分比是多少?或者是其他东西?此外,您应该描述到目前为止您为解决此问题所做的尝试。这个网站不是让人们免费为您工作的地方。 :)
  • 每个 C 实现都提供了 srand()rand() 函数。在某些 C 实现中,rand() 结果的低位在01 之间交替,使得rand() % 2 不合适。大多数 C 实现提供比srand()rand() 质量更高的其他随机数生成器。请参阅comp.lang.c FAQ,问题 13.15 及以下问题。
  • 我的意思是比率。对不起。所以如果比例是 3:2 说计数是 100 就需要产生 60 个 0 和 40 个 1 并且 0 的个数必须永远大于 1 的个数。

标签: c random binary


【解决方案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.0r&lt;p 保证。

【讨论】:

  • 这将有助于提供一些有关播种的信息或有关使用不需要播种的 CSPRNG 的信息。
  • @zaph 我添加了关于srand() 的进一步评论。该应用程序似乎与密码学无关。它似乎正在测试一个业务应用程序,在这种情况下rand() 会很好。
猜你喜欢
  • 1970-01-01
  • 2017-02-25
  • 2015-11-26
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 2018-10-13
  • 1970-01-01
相关资源
最近更新 更多