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

Race-condition as a random number generator

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

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

#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 %d\n", i);
            std::exit(1);
        }
    }
    std::exit(0);
}

Can I use it as a random number generator?

您真的不应该将其用作随机数。

why?

你不应该因为竞争条件是未定义的行为。

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

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

不应将未定义的行为用作 C++ 代码中熵的来源(或来源之一),即使它看起来是随机的。这是因为任何诸如计算机或编译器设置的轻微更改或某些东西的升级或使用不同的计算机都可能导致随机性大大降低。

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