我知道你可以使用rand() % 2 to
在C中随机选择0和1,但是有更高效的东西吗?
我的问题不是关于C,而是关于随机数生成器如何工作。如果我理解正确的话,他们会在种子上进行一些复杂的数学计算,以获得0到RAND_MAX之间的均匀分布,但是如果你只需要二元选择,有没有办法减少数学运算?
由于
答案 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;
这将以微输出率更新您的随机数。