gpt4 book ai didi

c - 在 Nginx 中生成均匀分布的随机数?

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:17 26 4
gpt4 key购买 nike

Nginx 似乎有一个名为 ngx_random 的内置函数,用于 various places的源代码。但它似乎只是定义为:#define ngx_random random

如果我理解正确的话,这意味着所有 Nginx 调用 ngx_random() 的地方它只是在调用(在 Linux 平台上)random() .来自doc我不清楚它是否保证以任何方式在给定范围内均匀分布,我怀疑与 rand() 类似,它是 not uniform at all ,并且只有当范围 n 可以被 RAND_MAX 整除时才会统一。

但使用 ngx_random 的好处是我相信系统会在启动时自动处理播种。而如果我想使用与我的范围真正统一的东西,比如 drand48 , 我相信必须在 ngx_posix_init.c 中的以下内容之后添加新行?

srandom(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec);
srand48(((unsigned) ngx_pid << 16) ^ tp->sec ^ tp->msec); //Added so that I can use drand48

那么我对 ngx_random 的假设是否正确?如果我想在各种模块的任何地方使用 drand48,是否只有上述方法才能做到这一点?

最佳答案

我自己从未尝试过使用 nginx,所以将其视为一个想法。在 Linux(或类似的基于 ELF 的系统,例如 Solaris)上,您可以使用 LD_LIBRARY_PRELOAD 技巧来替换和/或拦截标准 C 库中的弱符号。它通常用于拦截和/或替换 malloc,但也可能对您有用

代码示例(未经测试,未编译,只是为了演示一个想法)

#define _GNU_SOURCE

#include <stdlib.h>
#include <dlfcn.h>

static void (*real_srandom)(uint32_t) = NULL;

static void srandom_init(void) {
real_srandom = dlsym(RTLD_NEXT, "srandom");
if (NULL == real_srandom) {
fprintf(stderr, "Error in `dlsym`: %s\n", dlerror());
}
}

void srandom(uint32_t seed) {
if(real_srandom == NULL) {
srandom_init();
}

real_srandom(seed);
srand48(seed);
}

您也可以编写 SO 来替换对 random(3) 的调用,将其替换为您自己的实现。唯一不能替换的是 RAND_MAX,因为它是用常量编译的。

我很高兴知道这个技巧是否对你有用

关于c - 在 Nginx 中生成均匀分布的随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46009068/

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