gpt4 book ai didi

c - 线程安全随机数

转载 作者:行者123 更新时间:2023-11-30 16:20:38 25 4
gpt4 key购买 nike

我在 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]);
}
}

最佳答案

除了“=+ 1”问题...代码还存在一个问题:

Microsoft 明确表示种子是特定于线程的(请参阅 https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/srand ):

The srand function sets the starting point for generating a series of pseudorandom integers in the current thread.

这意味着种子值(/序列生成器)保存在线程本地存储中。但是,它们没有指定如果您在创建其他线程之前调用srand 会发生什么情况。因此,在我看来,包含种子值的线程本地存储要么从初始化线程复制,要么在您第一次调用 rand 时使用每个线程中的默认种子重新初始化。 code> 就好像您根本没有调用过 srand 一样。

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

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

关于c - 线程安全随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55231052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com