gpt4 book ai didi

c - 初始化状态与初始化状态_r : confusing arguments

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

我正在尝试理解 initstateinitstate_r 的联机帮助页。这两个函数都在初始化随机生成器。如果您有多个线程,则不应使用 initstate,但对于这种情况,您应该使用 initstate_r

这些函数的签名是

char *initstate(unsigned int seed, char *state, size_t n);
int initstate_r(unsigned int seed, char *statebuf,
size_t statelen, struct random_data *buf);

手册页的描述说

   The initstate() function allows a state array state to be initialized  for  use  by  random().
The size of the state array n is used by initstate() to decide how sophisticated a random num‐
ber generator it should use—the larger the state array, the better the random numbers will be.
seed is the seed for the initialization, which specifies a starting point for the random num‐
ber sequence, and provides for restarting at the same point.

The initstate_r() function is like initstate(3) except that it initializes the state in the
object pointed to by buf, rather than initializing the global state variable.

我不明白的是,为什么在 initstate_r 的情况下有两个参数保存随机生成器的状态:statebufbuf。如果 initstate 也有一个参数 state 来保存随机数生成器的状态,那么为什么还需要 initrand_r 的附加参数呢?他们不应该持有相同的信息吗?

statebufbuf 都必须是线程本地的吗?

最佳答案

两者都必须是线程本地的。

至于为什么你需要两者,嗯,这是一个(恕我直言,考虑不周的)设计选择。他们可以(应该?)将状态隐藏在 random_data 中,特别是因为 random_data 必须足够大才能保存 srandom_r 的状态(即大小为 128 的缓冲区)。

#include <stdlib.h>
#include <stdio.h>
int main()
{
int32_t i32;
struct random_data r;
srandom_r(1, &r);
random_r(&r, &i32);
return i32;
}

除了上述段错误(即使您首先将 r 可用值清零):通过阅读 https://sourceware.org/git/?p=glibc.git;a=blob_plain;f=stdlib/random_r.c;hb=656b84c2ef525e3b69802c9057c5897e327b0332看起来他们希望您为随机数组提供存储空间,即 srandom() 选择默认大小 128,srandom_r 希望您为状态数组提供空间。

我猜,其基本原理是状态数组可以很大(最大 256 字节),因此它们不会分配潜在的浪费空间(有些人费心为其线程保留较小的堆栈大小)。

关于statebufbuf的区别:statebuf保存了random_r需要的信息,即状态数组及其元数据(大小,无论如何)以打包格式(不透明,传统上压缩在 statebuf[0] 中 - 例如:第一个字节=大小,第二个字节=...),而 bufstatebuf 的“解压”版本,因此更方便实现 random_r。

我发现这更像是一种咆哮而不是答案 - 如果有什么特别难以理解的地方请告诉我:)

关于c - 初始化状态与初始化状态_r : confusing arguments,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184770/

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