gpt4 book ai didi

c - 为随机全局变量播种 rand()

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

我正在尝试使用 C 的 rand() 为伪随机数生成器初始化随机输入。由于我使用的 PRNG 测试库的限制,我的生成器函数不能接受任何参数,所以我似乎需要将初始值存储为全局变量。

理想情况下,我会使用 srand(time(NULL)) 作为生成器的种子,但是当我尝试全局执行时,这会抛出“initializer element is not a compile-time constant”错误。

最直接的方法是什么?到目前为止,我想出了将全局变量传递给函数并在那里完成工作的方法,如下所示:

unsigned int* w;
unsigned int* x;
unsigned int* y;
unsigned int* z;

void seed (unsigned int* first, unsigned int* second, unsigned int* third, unsigned int* fourth)
{
srand((unsigned int) time(NULL));
unsigned int a = rand();
unsigned int b = rand();
unsigned int c = rand();
unsigned int d = rand();

first = &a;
second = &b;
third = &c;
fourth = &d;
}

但是,当我尝试在 main 中访问我的值时,我在 Xcode 中遇到了 EXC_BAD_ACCESS 错误:

int main (void)
{
seed(w, x, y, z);
printf("%i", *w); // throws error
...
}

...我猜这与范围和在我希望它成为之前被释放的内存有关。没有大量的 C 经验,但这是正确的方法吗?如果是这样,我该如何解决这个错误?

谢谢!

最佳答案

您将指针分配给仅存在于堆栈中的值,而不是像您认为的那样将事物推回。一旦该堆栈超出范围,您就进入了危险区域。

应该这样写:

void seed (unsigned int* a, unsigned int* b, unsigned int* c, unsigned int* d)
{
srand((unsigned int) time(NULL));
*a = rand();
*b = rand();
*c = rand();
*d = rand();
}

int main() {
// Note: These can be global, they're just put here for convenience
// Remember, global variables are bad and you want to avoid them.
unsigned int a, b, c, d;
seed(&a, &b, &c, &d);

// ...
}

关于c - 为随机全局变量播种 rand(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087994/

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