作为随机数生成器的争用条件

Race-condition as a random number generator

本文关键字:争用条件 随机数生成器      更新时间:2023-10-16

我通过"pthread.h"模拟了C++线程之间的竞争条件 运行它时,它会在"随机"循环迭代中出错。

我可以将其用作随机数生成器吗? 为什么呢?

#include<cstdio>
#include<thread>
static int counter = 0;
void increase() {
register int i = counter;
i++;
counter = i;
}
void decrease() {
register int i = counter;
i--;
counter = i;
}
int main() {
std::thread *p1, *p2;
register int i = 0;
while (1) {
i++;
counter = 0;
p1 = new std::thread(increase);
p2 = new std::thread(decrease);
p1->join();
p2->join();
delete p1;
delete p2;
if (counter) {
std::fprintf(stderr, "Error at loop %dn", i);
std::exit(1);
}
}
std::exit(0);
}

我可以将其用作随机数生成器吗?

你真的不应该把它作为一个随机数。

为什么?

您不应该这样做,因为争用条件是未定义的行为。

这个"随机"数字没有很好的熵,因为它取决于时间。

有更好的方法 在#include <random>中生成随机数 .

未定义的行为不应用作C++代码中熵的来源(或来源之一(,即使它看起来是随机的。这是因为任何诸如计算机或编译器设置的微小更改或某些内容的升级或采用不同的计算机之类的事情都可能导致一些随机性要小得多的东西。

在计算中使用随机数生成器时,重要的属性之一是可复制的结果。此外,我们还希望有一个具有固定分布(通常是均匀分布(的可预测随机序列。