我通过“ 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 %d\n", i);
std::exit(1);
}
}
std::exit(0);
}
答案 0 :(得分:2)
我可以将其用作随机数生成器吗?
您真的不应该将其用作随机数。
为什么?
您不应这样做,因为竞争条件是不确定的行为。
这个“随机”数的熵值不高,因为它取决于时间。
在#include <random>
中有更好的方法来生成随机数。
答案 1 :(得分:1)
在C ++代码中,即使未定义的行为看起来是随机的,也不应用作熵的来源(或其中之一)。那是因为诸如计算机或编译器设置的微小变化,升级某些东西或购买另一台计算机之类的东西可能会导致随机性降低。
答案 2 :(得分:0)
在计算中使用随机数生成器时,重要的特性之一是可复制的结果。而且我们还希望有一个具有固定分布(通常是均匀分布)的可预测随机序列。