2

这是一些 c++ 代码的摘录,我将不得不在某些日子里详细解释:

std::vector<int> vct(8, 5);

std::generate(vct.begin(), vct.end(), &rand);

std::copy(vct.rbegin(), vct.rend(),
    std::ostream_iterator<int>(std::cout, "\n"));

我想我了解它的一切,除了那个小小的神秘&rand。它到底是做什么的?我的意思是显然它会产生某种伪随机数,但它们总是保持不变。&rand 是从哪里来的?它是一种什么样的表达方式?它产生的价值从何而来?我有点困惑……</p>

此外,我在代码中找不到任何其他出现的“rand”一词,也没有看到任何可能与随机数有关的代码。这让我想知道,因为我在 c++ 方面的(非常有限的)经验表明,只有很少的东西可以简单地工作而无需事先声明或包含。

感谢您的帮助!

4

5 回答 5

13

&in&rand返回函数的地址rand()。您正在传递一个函数指针,generate()以便generate()可以调用rand()以生成随机数。

于 2009-11-06T01:29:09.307 回答
5

rand()是 C 标准库中的一个函数,它生成 0 和 define 之间的伪随机数RAND_MAX。如果您使用 C++,请包含标题<cstdlib>以使用它(而不是<stdlib.h>srand()让您设置种子。如果您每次运行应用程序时都想要一个新的种子,您可以使用 time() 中的值作为种子。

2001 年的POSIX 标准具有rand()srand()的示例实现。我从我的手册页复制粘贴它。您的 C 标准库使用的实现可能与此不同:

static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed) {
    next = seed;
}

此外,&从函数中获取地址。编译器在这方面有点模棱两可。当您需要函数指针的地址时,有些需要使用此运算符;其他人没有。generate<algorithm>C++ 标准库的头文件中的一个函数。它接受函数和/或仿函数对象,并使用它为您指定的迭代器容器生成值。

于 2009-11-06T01:36:17.213 回答
2

rand在 cstdlib 中定义。您获得相同的价值是因为您使用的是相同的“种子”。这是设计使然。

如果您想要不同的种子,srand请先调用,例如srand(time(NULL));.

于 2009-11-06T01:27:19.510 回答
0

rand() 是标准 C 库中的一个函数。它的签名是:

int rand(void);

它在 stdlib.h 中定义。最有可能的是,当您包含或 .

于 2009-11-06T01:30:13.577 回答
0

&rand只是表示“的地址rand。” rand是标准库中的一个函数,它返回伪随机数。您正在做的是将此函数的地址传递给算法。然后,他们在工作过程中调用此函数。

就其rand本身而言,任何体面的 C++ 文档都会告诉您为什么它的行为方式与您所观察的方式相同……(此处的其他答案也是如此)

于 2009-11-06T01:30:52.437 回答