Неожиданное поведение программы с многопоточностью

Есть задача о том, чтобы путем экспериментов определить шансы на победу игроков в Кости. На вход в программу подается, количество бросков за тур K, какой сейчас тур, какое сейчас суммарное количество очков у каждого игрока и количество экспериментов. Требуется использовать многопоточность, при чем количество потоков подается как аргумент программе. Моя идея состоит в том, чтобы запускать каждый эксперимент в отдельном потоке, для этого я написал следующий код. Но он работает не так как я ожидал, например при входных данных 3 1 0 0 3 программа выдает одинаковые шансы игроков равные 33.3333%. В чем может заключаться ошибка, возможно я как-то не так передаю аргументы в функцию, или не там дожидаюсь завершения потоков(t.join()) ?

#include <iostream>
#include <thread>
#include <vector>

using namespace std;

void dice_roll(int &sum1, int &sum2,int &won1, int &won2, int K){
   /* cout << sum1 << "\t" << sum2 << endl;*/
    for (int i = 0; i < K; ++i) {
        sum1 = sum1 + (rand() % 12 + 1);
        sum2 = sum2 + (rand() % 12 + 1);
    }
    if (sum1 > sum2) ++won1;
    else if (sum1 < sum2) ++won2;
    else return;
    cout << sum1 << "\t" << sum2 << endl;
}

int main(int argc, char *argv[]) {
    if (argc != 2){
        cout << "enter number of threads as a flag\n";
        exit(1);
    }
    int threads_num = atoi(argv[1]);
    vector<thread> threads;
    cout << "Threads_num: " << threads_num << endl;
    int K, tour, sum1, sum2, experiments;
    int won1 = 0, won2 = 0;
    cout << "Введите K, тур, суммарные очки игроков, количество экспериментов: ";
    cin >> K >> tour >> sum1 >> sum2 >> experiments;
    for (int i = 0; i < experiments; ++i) {
        thread t(dice_roll, ref(sum1), ref(sum2), ref(won1), ref(won2), K);
        threads.push_back(move(t));
    }
    for(auto & thread : threads){
        thread.join();
    }
    cout << won1 << " " << won2 << endl;
    cout << "Player1 chances: " << double(won1) / experiments * 100 << "%" << endl;
    cout << "Player2 chances: " << double(won2) / experiments * 100 << "%" << endl;
    return 0;
}

Ответы (0 шт):