C 线程安全随机数
我在Windows上用C语言生成随机数时遇到了一个问题。简而言之,我想做的是生成7个0或1的数字。然后函数将这些数字相加,结果将是全局定义数组的索引,该索引的值将增加1。但在生成函数中,我总是得到相同的数字序列。我做错了什么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
#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等等。它总是给出相同的值。我试过了,但这不是问题所在。我仍然得到同样的数字。