Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 线程安全随机数_C_Multithreading_Numbers_Random Seed - Fatal编程技术网

C 线程安全随机数

C 线程安全随机数,c,multithreading,numbers,random-seed,C,Multithreading,Numbers,Random Seed,我在Windows上用C语言生成随机数时遇到了一个问题。简而言之,我想做的是生成7个0或1的数字。然后函数将这些数字相加,结果将是全局定义数组的索引,该索引的值将增加1。但在生成函数中,我总是得到相同的数字序列。我做错了什么 #include <windows.h> #include <stdio.h> #include <time.h> int cells[8]; int generator(int n) { int i; int sum

我在Windows上用C语言生成随机数时遇到了一个问题。简而言之,我想做的是生成7个0或1的数字。然后函数将这些数字相加,结果将是全局定义数组的索引,该索引的值将增加1。但在生成函数中,我总是得到相同的数字序列。我做错了什么

#include <windows.h>
#include <stdio.h>
#include <time.h>

int cells[8];

int generator(int n) {
    int i;
    int sum = 0;

    for (i = 0; i < n; i++) {
        int random_number = rand() % 2 + 0;
        printf("%d ",random_number);
        sum += random_number;

    }
    printf("\n%d\n",sum);
    return sum;
}

DWORD WINAPI ThreadFunc(void *data) {
    cells[generator(7)] =+ 1;
    return 0;
}

int main() {
    srand(time(NULL));
    for (int i = 0; i < 10; ++i) {
        HANDLE thread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);
        WaitForSingleObject(thread, INFINITE);
    }
    for (int j = 0; j < 8; ++j) {
        printf("%i: %i\n", j, cells[j]);
    }
}
#包括
#包括
#包括
int细胞[8];
整数生成器(整数n){
int i;
整数和=0;
对于(i=0;i
您不需要线程安全的随机数。您的代码总是以精确的确定顺序调用
rand
,因为您等待每个线程完成,然后再开始下一个线程。你的问题是这个

cells[generator(7)] =+ 1;
这会将单元格设置为
+1
,而不是向其中添加一个。

除了“
=+1
”问题之外。。。该准则还有一个问题:

Microsoft明确表示种子是线程特定的(请参阅):

srand函数设置在当前线程中生成一系列伪随机整数的起点

这意味着种子值(/sequence generator)保存在线程本地存储中。但是,如果在创建其他线程之前调用
srand
,它们不会指定会发生什么。因此,在我看来,包含seed值的线程本地存储很可能会从初始化线程复制,或者在您第一次调用
rand
时,它会在每个线程中使用默认seed重新初始化,就像您根本没有调用
srand
一样

无论哪种情况,所有线程最终都会生成相同的伪随机序列


因此,最好调用
time
一次,将线程索引添加到该初始时间值,将结果作为参数传递给线程函数,然后使用该(线程特定的)值作为参数传递给线程内的
srand
。至少每个线程将从不同的初始种子值开始。

令人印象深刻的复杂性!:-)此外,在行<代码>单元[生成器(7)]=+1您可能打算使用
+=
。基本上是同一个问题,我懒得再回答一遍。伙计们,我纠正了那个错误,但这不是我的问题。我的问题是每次调用函数时,它都打印相同的值。例如循环中的第一次迭代:1 0 1 1。第二次迭代:1、0、1、1等等。它总是给出相同的值。我试过了,但这不是问题所在。我仍然得到同样的数字。