当我只想要0或1时,有效的随机函数

时间:2017-08-17 17:45:33

标签: c performance random

我知道你可以使用rand() % 2 to在C中随机选择0和1,但是有更高效的东西吗?

我的问题不是关于C,而是关于随机数生成器如何工作。如果我理解正确的话,他们会在种子上进行一些复杂的数学计算,以获得0到RAND_MAX之间的均匀分布,但是如果你只需要二元选择,有没有办法减少数学运算?

由于

2 个答案:

答案 0 :(得分:4)

  如果您只需要二元选择,有没有办法减少数学运算?

是的,但这取决于如何“好”随机分布和序列(或明显缺乏)是必需的。 C未指定rand()的质量。随着指定的随机性质,存在替代解决方案。多快? - 这取决于许多OP未提供的东西。如果代码要使用rand(),则以下内容将适度提高简单rand() % 2u

的效果

偶尔呼叫rand()以提取n随机位,并在每次呼叫时使用其中的1位。

此功能使用RAND_MAX来评估每n次呼叫收到的位数rand()。值RAND_MAX == 32767或0x7FFF意味着15个随机位。

int rand01(void) {
  // Insure RAND_MAX is a power-of-2 - 1
  assert(((RAND_MAX + 1u) & RAND_MAX) == 0);

  static unsigned rmax = 0;
  static int rbits;
  if (rmax == 0) {
    rmax = RAND_MAX;
    rbits = rand();
  }
  rmax /= 2u;
  int r = rbits%2u;
  rbits /= 2u;
  return r;
}

请注意,此方法不会使用srand()完全重置随机状态。 srand()调用不知道此函数的状态。

答案 1 :(得分:0)

也许您可以尝试使用我的方法:

int i;
i = time(NULL) % 2;

这只适用于每秒不超过一个随机但你也可以这样做的事情:

struct timeval tv;
gettimeofday(&tv,NULL);
unsigned long random_number = (1000000 * tv.tv_sec + tv.tv_usec) % 2;

这将以微输出率更新您的随机数。