Расовое состояние как генератор случайных чисел - PullRequest
0 голосов
/ 31 августа 2018

Я симулировал состояние гонки между потоками в C ++ с помощью "pthread.h" при запуске он выдает ошибку при «случайной» итерации цикла.

Могу ли я использовать его как генератор случайных чисел? А почему?

#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);
}

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Неопределенное поведение не должно использоваться в качестве источника (или одного из источников) энтропии в коде C ++, даже если оно выглядит случайным. Это связано с тем, что что-то вроде небольших изменений в настройках компьютера или компилятора, обновления чего-либо или перехода на другой компьютер может привести к чему-то гораздо менее случайному.

0 голосов
/ 31 августа 2018

Можно ли использовать его как генератор случайных чисел?

вы действительно не должны использовать его как случайное число.

почему

вы не должны этого делать, потому что условия гонки - неопределенное поведение.

это «случайное» число не обладает хорошей энтропией, поскольку зависит от времени.

есть гораздо лучший способ генерировать случайные числа в #include <random>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...